#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
const int N=500010;
int tt;
deque <int> Q;
map <int,int> w[N];
int head[N],to[N*3],nxt[N*3],s[N*3],dis[N];
inline int gi() {
    int x=0,o=1;
    char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') o=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*o;
}
inline void lnk(int x,int y,int z) {
    to[++tt]=y,nxt[tt]=head[x],s[tt]=z,head[x]=tt;
    to[++tt]=x,nxt[tt]=head[y],s[tt]=z,head[y]=tt;
}
int main() {
    int n,m;
    cin>>n>>m;
    for(int i=1,cnt=n;i<=m;i++) {
	int x=gi(),y=gi(),z=gi(),&X=w[x][z],&Y=w[y][z];
	if(!X) X=++cnt;
	if(!Y) Y=++cnt;
	lnk(X,Y,0),lnk(X,x,1),lnk(Y,y,1);
    }
    memset(dis,-1,sizeof(dis));
    Q.push_back(1),dis[1]=0;
    while(!Q.empty()) {
	int x=Q.front();
	Q.pop_front();
	for(int i=head[x];i;i=nxt[i]) {
	    int y=to[i];
	    if(dis[y]==-1) {
		dis[y]=dis[x]+s[i];
		if(y==n) return cout<<dis[y]/2,0;
		if(s[i]) Q.push_back(y);
		else Q.push_front(y);
	    }
	}
    }
    puts("-1");
    return 0;
}