#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 200005
#define FI first
#define SE second
#define INF 0x3f3f3f3f 
int n,m;
vector<pair<int,int>>G[MAXN];
int d[MAXN];
int vis[MAXN];
struct Node{
	int u,v,w;//那，路，钱 
	bool operator < (const Node & a) const{
		return w>a.w;
		
	}
};
int dij(){
	priority_queue< Node >q;
	q.push({1,-1,0});
	d[1]=0;
	while(!q.empty()){
		Node u=q.top();
		int now=u.u;
		int roa=u.v;
		int far=u.w;
		q.pop();
		vis[now]=1;
		if(now==n){
			return far;	
		}
		for(auto e:G[now]){
			if(!vis[e.FI]){
				if(e.SE==roa && d[e.FI]>d[now]){
					d[e.FI]=d[now];
					q.push({e.FI,e.SE,d[e.FI]});
				}
				if(e.SE!=roa && d[e.FI]>d[now]+1){
					d[e.FI]=d[now]+1;
					q.push({e.FI,e.SE,d[e.FI]});
				}
			}
		}
	}
	return -1;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++){
		int u,v,c;
		scanf("%d%d%d",&u,&v,&c);
		G[u].push_back({v,c});
		G[v].push_back({u,c});
	}
	for(int i=0;i<n;i++){
		d[i]=INF;
		vis[i]=0;
	}
	printf("%d\n",dij());
	return 0;
 } 