#include <bits/stdc++.h>
using namespace std;

#define IL inline 
IL int read() {
	char ch = getchar(); int u = 0, f = 1;
	while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
	while (isdigit(ch)) { u = (u << 1) + (u << 3) + ch - 48; ch = getchar(); }
	return u * f; 
}

const int maxn = 5e5 + 10;
int dis[maxn]; bool flag[maxn];
set<int>F[maxn];
vector<pair<int,int> >e[maxn];

int main() {
#ifdef Edgration
	freopen("1.in", "r", stdin);
#endif
	int n = read(), m = read();
	for (int i = 1; i <= m; ++i) {
		int x = read(), y = read(), c = read();
		e[x].push_back(make_pair(y, c)); e[y].push_back(make_pair(x, c));
	}	
	priority_queue<pair<int,int> >q;
	q.push(make_pair(0, 1)); 
	memset(dis, 0x3f, sizeof dis); dis[1] = 0;
	while (!q.empty()) {
		int u = q.top().second; q.pop();
		if (flag[u]) continue;
		flag[u] = 1;
		for (int i = 0; i < e[u].size(); ++i) {
			int v = e[u][i].first; int w = e[u][i].second;
			int c = F[u].count(w) ? 0 : 1;
			if (dis[v] > dis[u] + c) {
				dis[v] = dis[u] + c;
				F[v].clear();
				F[v].insert(w);
				q.push(make_pair(-dis[v], v));
			}
			else if (dis[v] == dis[u] + c) F[v].insert(w);
		}
	}
	cout << (dis[n] == 0x3f3f3f3f ? -1 : dis[n]) << endl;
	return 0;
}