#include<iostream>
#include<set>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn=2e5+10;
vector<pair<int,int> >G[maxn];
int vis[maxn];
int n,m;
struct Node{
	int pos,t,c;
}start,tmp;
bool bfs(){
	queue<Node>q;
	start.pos=1,start.t=1,start.c=0;
	vis[1]=1;
	q.push(start);
	while(!q.empty()){
		tmp=q.front();q.pop();
		int x=tmp.pos;
		if(x==n) {
			cout<<tmp.t<<endl;
			return 1;
		}
		if(!tmp.c){
		   for(int i=0;i<G[x].size();i++){
				start.pos=G[x][i].first,start.t=1,start.c=G[x][i].second;
				vis[G[x][i].first]=1;
				q.push(start);
		   }
	    }
	    else {
	    	for(int i=0;i<G[x].size();i++){
	    		int k=G[x][i].second,f=G[x][i].first;
	    		if(k==tmp.c&&!vis[f]) {
	    			start.pos=f,start.t=tmp.t,start.c=tmp.c;
	    			q.push(start);
	    			vis[f]=1;
	    		}
	    	}
	    	for(int i=0;i<G[x].size();i++){
	    		int k=G[x][i].second,f=G[x][i].first;
	    		if(!vis[f]) {
	    			start.pos=f,start.t=tmp.t,start.c=k;
	    			if(k!=tmp.c) start.t=start.t+1;
	    			q.push(start);
	    			vis[f]=1;
	    		}
	    	}
	    }
	}
}
int main(){
	cin>>n>>m;
	int u,v,w;
	for(int i=0;i<m;i++){
		cin>>u>>v>>w;
		G[u].push_back(make_pair(v,w));
		G[v].push_back(make_pair(u,w));
	}
	if(!bfs()) cout<<-1<<endl;
	
}