// 0-1 BFS with virtual vertices
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define Map unordered_map
using namespace std;

int n,m;
Map<ll,vector<pair<ll,int>>> adj;
Map<ll,int> d;
Map<ll,bool> vst;

ll id(int x,int y){
	return 100000000LL*x+y;
}

int main() {
	#ifdef kvutxdy
	freopen("C:/Users/khanh/OneDrive/RoadtoPurple/Code/Codeforces/input.in", "r", stdin);
	#endif
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m;
	for(int i=0;i<m;++i){
		int u,v,c;
		cin>>u>>v>>c;
		adj[id(u,c)].push_back({id(v,c),0});
		adj[id(v,c)].push_back({id(u,c),0});
		adj[id(u,c)].push_back({id(u,0),0});
		adj[id(u,0)].push_back({id(u,c),1});
		adj[id(v,c)].push_back({id(v,0),0});
		adj[id(v,0)].push_back({id(v,c),1});
	}
	deque<ll> dq;
	d[id(1,0)]=0;
	dq.push_front(id(1,0));
	while(!dq.empty()){
		ll u=dq.front();
		dq.pop_front();
		vst[u]=true;
		for(auto nxt:adj[u]){
			ll v=nxt.fi;
			int c=nxt.se;
			if(vst.count(v)) continue;
			if(!d.count(v)||d[u]+c<d[v]){
				d[v]=d[u]+c;
				if(c==0) dq.push_front(v);
				else dq.push_back(v);
			}
		}
	}
	if(!d.count(id(n,0))) cout<<-1;
	else cout<<d[id(n,0)];
}