#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
int pa[111111],id[111111],cnt;
bool used[111111];
int n,m,x,y,z;
vector<pair<int,int> > g[1111111];
vector<int> gra[1111111];
void Init(int i)
{
	pa[i]=i;
	used[i]=0;
	id[i]=-1;	
}
int root(int x)
{
	if (pa[x]!=x) pa[x]=root(pa[x]);
	return pa[x];
}
void Union(int x,int y)
{
	int rx=root(x),ry=root(y);
	if (rx==ry) return;
	pa[rx]=ry;
}
queue<int> q;
int dist[1111111];
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		g[z].push_back(make_pair(x,y)); 
	}
	cnt=n;
	for (int i=1;i<=1000000;i++)
	{
		for (int j=0;j<g[i].size();j++)
		{
			Init(g[i][j].first);
			Init(g[i][j].second);
		}
		for (int j=0;j<g[i].size();j++)
		{
			Union(g[i][j].first,g[i][j].second);
		}
		for (int j=0;j<g[i].size();j++)
		{
			x=g[i][j].first;y=g[i][j].second;
			if (!used[x])
			{
				int r=root(x);
				if (!~id[r]) id[r]=++cnt;
				used[x]=1;
				gra[x].push_back(id[r]);
				gra[id[r]].push_back(x); 
			}
			if (!used[y])
			{
				int r=root(y);
				if (!~id[r]) id[r]=++cnt;
				used[y]=1;
				gra[y].push_back(id[r]);
				gra[id[r]].push_back(y);  
			}
		}
	}
	memset(dist,-1,sizeof(dist));
	q.push(1);dist[1]=0;
	while(!q.empty())
	{
		x=q.front();q.pop();
		for (int i=0;i<gra[x].size();i++)
		{
			int to=gra[x][i];
			if (!~dist[to])
			{
				dist[to]=dist[x]+1;
				q.push(to); 
			}
		}
	}
	if (!~dist[n]) printf("-1\n");
	else printf("%d\n",dist[n]/2);
	return 0;
}