Problem: Snuke's town has a subway system, consisting of N stations and M railway lines. The stations are numbered 1 through N. Each line is operated by a company. Each company has an identification number.

The i-th ( 1 \leq i \leq M ) line connects station p_i and q_i bidirectionally. There is no intermediate station. This line is operated by company c_i.

You can change trains at a station where multiple lines are available.

The fare system used in this subway system is a bit strange. When a passenger only uses lines that are operated by the same company, the fare is 1 yen (the currency of Japan). Whenever a passenger changes to a line that is operated by a different company from the current line, the passenger is charged an additional fare of 1 yen. In a case where a passenger who changed from some company A's line to another company's line changes to company A's line again, the additional fare is incurred again.

Snuke is now at station 1 and wants to travel to station N by subway. Find the minimum required fare.

Constraints

* 2 \leq N \leq 10^5
* 0 \leq M \leq 2×10^5
* 1 \leq p_i \leq N (1 \leq i \leq M)
* 1 \leq q_i \leq N (1 \leq i \leq M)
* 1 \leq c_i \leq 10^6 (1 \leq i \leq M)
* p_i \neq q_i (1 \leq i \leq M)

Input

The input is given from Standard Input in the following format:


N M
p_1 q_1 c_1
:
p_M q_M c_M


Output

Print the minimum required fare. If it is impossible to get to station N by subway, print `-1` instead.

Examples

Input

3 3
1 2 1
2 3 1
3 1 2


Output

1


Input

8 11
1 3 1
1 4 2
2 3 1
2 5 1
3 4 3
3 6 3
3 7 3
4 8 4
5 6 1
6 7 5
7 8 5


Output

2


Input

2 0


Output

-1

Solution (in CPP):

Solution:
#include <bits/stdc++.h>

#define lld long long
#define pii pair<int,int>
#define pll pair<lld,lld>
#define pb push_back
#define next nextt
#define Inf 1000000000
#define Linf 1000000000000000000LL
#define Mod 1000000007

using namespace std;

int N,M;
int dv[100002];
bool checkv[100002];
map<int,int> d[100002];
vector<pii> edge[100002];
map<int,vector<int>> grp[100002];
priority_queue<pair<int,pii>,vector<pair<int,pii>>,greater<pair<int,pii>>> q;

int main(){
	scanf("%d %d",&N,&M);
	for(int i=1; i<=M; i++){
		int x,y,z;
		scanf("%d %d %d",&x,&y,&z);
		edge[x].pb({y,z});
		edge[y].pb({x,z});
		d[x][z] = d[y][z] = Inf;
		grp[x][z].pb(y); grp[y][z].pb(x);
	}
	for(int i=1; i<=N; i++) dv[i] = Inf;
	d[1][0] = dv[1] = 0;
	q.push({0,{1,0}});
	while(!q.empty()){
		int v,color,value;
		v = q.top().second.first;
		color = q.top().second.second;
		value = q.top().first;
		q.pop();
		if(!checkv[v]){
			checkv[v] = true;
			for(auto &i : edge[v]){
				dv[i.first] = min(dv[i.first],dv[v]+1);
				if(d[i.first][i.second] > dv[v]+1){
					d[i.first][i.second] = dv[v]+1;
					q.push({dv[v]+1,{i.first,i.second}});
				}
			}
		}
		for(auto &i : grp[v][color]){
			dv[i] = min(dv[i],value);
			if(d[i][color] > value){
				d[i][color] = value;
				q.push({value,{i,color}});
			}
		}
	}
	if(dv[N] == Inf) dv[N] = -1;
	printf("%d\n",dv[N]);

	return 0;
}