#include <bits/stdc++.h>
#define ll long long
#define MAXN 200010
#define llinf 1000000000000000
using namespace std;
vector<pair<ll,ll> > G[MAXN];
ll n,d[MAXN][2],u,v;
void Dijkstra()
{
    priority_queue<pair<ll,pair<ll,ll> >,vector<pair<ll,pair<ll,ll> > >,greater<pair<ll,pair<ll,ll> > > > q;
    for (ll i=1;i<=n;i++)
    {
        d[i][0]=llinf;
        d[i][1]=llinf;
    }
    d[u][0]=0;
    q.push({0,{u,0}});
    while (!q.empty())
    {
        auto t=q.top();
        q.pop();
        if (d[t.second.first][t.second.second]!=t.first)
            continue;
        for (auto next : G[t.second.first])
        {
            if (next.second)
            {
                if (t.second.second && t.first<d[next.first][1])
                {
                    d[next.first][1]=t.first;
                    q.push({t.first,{next.first,1}});
                }
                if (!t.second.second && t.first+1<d[next.first][1])
                {
                    d[next.first][1]=t.first+1;
                    q.push({t.first+1,{next.first,1}});
                }
                continue;
            }
            if (t.second.second && t.first+1<d[next.first][0])
            {
                d[next.first][0]=t.first+1;
                q.push({t.first+1,{next.first,0}});
            }
            if (!t.second.second && t.first<d[next.first][0])
            {
                d[next.first][0]=t.first;
                q.push({t.first,{next.first,0}});
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll m,a,b,t;
    cin >> n >> m;
    for (ll i=1;i<=m;i++)
    {
        cin >> a >> b >> t;
        G[a].push_back({b,t});
        G[b].push_back({a,t});
    }
    cin >> u >> v;
    Dijkstra();
    if (d[v][0]==llinf && d[v][1]==llinf)
        cout << -1 << "\n";
    else
        cout << min(d[v][0],d[v][1]) << "\n";
    return 0;
}