Problem:
Score : 600 points

Problem Statement

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.

Sample Input 1

3 3
1 2 1
2 3 1
3 1 2

Sample Output 1

1

Use company 1's lines: 1 → 2 → 3. The fare is 1 yen.

Sample Input 2

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

Sample Output 2

2

First, use company 1's lines: 1 → 3 → 2 → 5 → 6. Then, use company 5's lines: 6 → 7 → 8. The fare is 2 yen.

Sample Input 3

2 0

Sample Output 3

-1

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<queue>
#include<ctime>
#include<map>
#define ll long long
#define pr(x) cerr<<#x<<"="<<x<<endl
using namespace std;
#define N 2000010
int n,m,i,j,dis[N],to[N],tp[N],tq[N],size,cnt,g[N],vis[N],o,p,q;
vector<int> col[N];
#define pa pair<int,int>
map<pair<int,int>,int>mp;
struct node
{
	int to,next,v;
}e[N*2];
void add(int o,int p,int q)
{
	e[++size].to=p;
	e[size].next=g[o];
	g[o]=size;
	e[size].v=q;
}
void dij()
{
	for (i=1;i<=cnt;i++)dis[i]=100000000;
	priority_queue<pa,vector<pa>,greater<pa> >que;
	dis[1]=0;
	que.push(make_pair(0,1));
	while (!que.empty())
	{
		int x=que.top().second;
		que.pop();
		if (vis[x]) continue;
		vis[x]=1;
		for (int k=g[x];k;k=e[k].next)
		{
			int y=e[k].to;
			if (dis[x]+e[k].v<dis[y])
			{
				dis[y]=dis[x]+e[k].v;
				que.push(make_pair(dis[y],y));
			}
		}
	}
}
int main()                   
{
	freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (i=1;i<=m;i++)
	{
		scanf("%d %d %d",&o,&p,&q);
		col[o].push_back(q);
		col[p].push_back(q);
		to[i]=o,tp[i]=p,tq[i]=q;
	}
	cnt=n;
	for (i=1;i<=n;i++)
	{
		for (j=0;j<(int)col[i].size();j++)
		{
			if (mp[make_pair(i,col[i][j])]==0)
			{
				mp[make_pair(i,col[i][j])]=++cnt;
				//printf("point %d color %d --> %d\n",i,col[i][j],cnt);
				add(cnt,i,1);
				add(i,cnt,1);
			}
		}
	}
	for (i=1;i<=m;i++)
	{
		int tmpa=mp[make_pair(to[i],tq[i])],tmpb=mp[make_pair(tp[i],tq[i])];
		add(tmpa,tmpb,0);
		add(tmpb,tmpa,0);
	}
	//for (i=1;i<=size;i+=2)printf("%d--%d %d\n",e[i].to,e[i+1].to,e[i].v);
	dij();
	if (dis[n]==100000000)
	printf("-1\n");
	else 
	printf("%d\n",dis[n]/2);
	return 0;
}