/* Rozwiazanie wzorcowe do zadania GRA (Kolorowe grafy)
 * Autor: Jakub Radoszewski
 * Opis: zmodyfikowany BFS.
*/

#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;

const int M = 500010;
const int INFTY = 100000000;

int n, m;
vector<pair<int, int> > t[M];
int d[M][2];

void BFS(int v0)
{
  for (int i = 0; i < n; ++i)
    d[i][0] = d[i][1] = INFTY;
  d[v0][0] = d[v0][1] = 0;
  vector<pair<int, int> > kol;
  kol.push_back(make_pair(v0, 0));
  kol.push_back(make_pair(v0, 1));
  for (int ii = 0; ii < (int)kol.size(); ++ii)
  {
    int v = kol[ii].first, c = kol[ii].second;
    for (int i = 0; i < (int)t[v].size(); ++i)
      if (t[v][i].second != c)
      {
        int &d0 = d[t[v][i].first][t[v][i].second];
        if (d0 > d[v][c] + 1)
        {
          d0 = d[v][c] + 1;
          kol.push_back(make_pair(t[v][i].first, t[v][i].second));
        }
      }
  }
  for (int i = 1; i <= n - 1; ++i)
  {
    int a = min(d[i][0], d[i][1]);
    printf("%d\n", a >= INFTY ? -1 : a);
  }
}

int main()
{
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; ++i)
  {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    --a; --b;
    t[a].push_back(make_pair(b, c));
    t[b].push_back(make_pair(a, c));
  }
  BFS(0);
  return 0;
}
