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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main {

	static Scanner sc = new Scanner(System.in);
	static int N, M;
	static Station[] ss;

	public static void main(String[] args) {
		N = sc.nextInt();
		M = sc.nextInt();
		ss = new Station[N];
		for (int i = 0; i < N; ++i) {
			ss[i] = new Station();
		}
		for (int i = 0; i < M; ++i) {
			int P = Integer.parseInt(sc.next()) - 1;
			int Q = Integer.parseInt(sc.next()) - 1;
			int C = Integer.parseInt(sc.next());
			ss[P].add(C, Q);
			ss[Q].add(C, P);
		}
		System.out.println(solve());
	}

	static int solve() {
		boolean[] visited = new boolean[N];
		visited[0] = true;
		ArrayList<Integer> cur = new ArrayList<>();
		cur.add(0);
		for (int i = 0; !cur.isEmpty(); ++i) {
			ArrayList<Integer> next = new ArrayList<>();
			for (int pos : cur) {
				HashMap<Integer, ArrayList<Integer>> map = ss[pos].next;
				for (int c : map.keySet()) {
					ArrayList<Integer> ns = map.get(c);
					ArrayList<Integer> cand = new ArrayList<>();
					for (int j = 0; j < ns.size(); ++j) {
						if (!visited[ns.get(j)]) {
							cand.add(ns.get(j));
							visited[ns.get(j)] = true;
						}
					}
					for (int j = 0; j < cand.size(); ++j) {
						if (cand.get(j) == N - 1) return i + 1;
						ArrayList<Integer> nlist = ss[cand.get(j)].next.get(c);
						for (int n : nlist) {
							if (!visited[n]) {
								cand.add(n);
								visited[n] = true;
							}
						}
					}
					next.addAll(cand);
					for (int j = 0; j < cand.size(); ++j) {
						ss[cand.get(j)].next.remove(c);
					}
				}
				ss[pos].next.clear();
			}
			cur = next;
		}
		return -1;
	}

	static class Station {
		HashMap<Integer, ArrayList<Integer>> next = new HashMap<>();

		void add(int c, int id) {
			if (next.containsKey(c)) {
				next.get(c).add(id);
			} else {
				ArrayList<Integer> list = new ArrayList<>();
				list.add(id);
				next.put(c, list);
			}
		}
	}
}