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: Runtime Error)

#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
using VI = vector<int>;
using VL = vector<LL>;
using PII = pair<int, int>;
using PLL = pair<LL, LL>;

#define SZ(a) (int)a.size()
#define ALL(a) a.begin(), a.end()
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define F first
#define S second
#define FOR(i, a, b) for (int i = (a); i<(b); ++i)
#define RFOR(i, b, a) for (int i = (b)-1; i>=(a); --i)
#define FILL(a, b) memset(a, b, sizeof(a))

void dout() { cerr << endl; }

template <typename Head, typename... Tail>
void dout(Head H, Tail... T) {
    cerr << H << ' ';
    dout(T...);
}

const int INF = 1e9 + 47;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vector<vector<PII>> g(n);
    FOR(i, 0, m)
    {
        int u, v, w;
        cin >> u >> v >> w;
        u--; v--;
        g[u].EB(v, w);
        g[v].EB(u, w);
    }
    deque<PII> q;
    vector<unordered_map<int, int>> d(n);
    VI md(n, INF);
    md[0] = 0;
    for (auto e : g[0])
    {
        d[e.F][e.S] = 1;
        md[e.F] = 1;
        q.emplace_back(e.F, e.S);
    }
    int last = 0;
    while (SZ(q))
    {
        int u = q.front().F;
        int c = q.front().S;
        q.pop_front();
        assert(last <= d[u][c]);
        last = d[u][c];
        for (auto e : g[u])
        {
            int v = e.F;
            int cc = e.S;
            if (d[v].count(cc) && cc != c)
            {
                assert(d[u][c] + 1 >= d[v][cc]);
                continue;
            }
            if (cc == c)
            {
                if (d[v].count(c))
                    d[v][c] = min(d[v][c], d[u][c]);
                else
                {
                    d[v][c] = d[u][c];
                    q.emplace_front(v, cc);
                }
            }
            else
            {
                d[v][cc] = md[u] + 1;
                q.emplace_back(v, cc);
            }
            md[v] = min(md[v], d[v][cc]);
        }
    }
    if (SZ(d[n - 1]))
    {
        cout << md[n - 1];
    }
    else
        cout << -1;
    return 0;
}