#include <bits/stdc++.h>
using namespace std;

vector<long long> adj0[250000], adj1[250000], adjk[250000];
long long komp0[250000], komp1[250000];
bool vis[250000];

void dfs0(long long node, long long komp) {
    komp0[node]=komp;
    for(long long i=0; i<adj0[node].size(); i++) {
        if(komp0[adj0[node][i]]==0) dfs0(adj0[node][i], komp);
    }
}

void dfs1(long long node, long long komp) {
    komp1[node]=komp;
    for(long long i=0; i<adj1[node].size(); i++) {
        if(komp1[adj1[node][i]]==0) dfs1(adj1[node][i], komp);
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    long long N, M, S, G, a, b, t, k, c0, c1;
    cin>>N>>M;
    for(int i=1; i<=M; i++) {
        cin>>a>>b>>t;
        if(t==0) {
            adj0[a].push_back(b);
            adj0[b].push_back(a);
        }
        else {
            adj1[a].push_back(b);
            adj1[b].push_back(a);
        }
    }
    cin>>S>>G;
    k=0;
    for(int i=1; i<=N; i++) {
        if(komp0[i]==0) {
            dfs0(i, ++k);
        }
    }
    for(int i=1; i<=N; i++) {
        if(komp1[i]==0) {
            dfs1(i, ++k);
        }
    }
    for(int i=1; i<=N; i++) {
        adjk[komp0[i]].push_back(komp1[i]);
        adjk[komp1[i]].push_back(komp0[i]);
    }
    c0=komp0[G];
    c1=komp1[G];
    queue<pair<int, int> > q;
    q.push(make_pair(komp0[S], 0));
    vis[komp0[S]]=true;
    while(!q.empty()) {
        if(q.front().first==c0||q.front().first==c1) {
            cout<<q.front().second<<'\n';
            break;
        }
        for(int i=0; i<adjk[q.front().first].size(); i++) {
            if(!vis[adjk[q.front().first][i]]) {
                q.push(make_pair(adjk[q.front().first][i], q.front().second+1));
                vis[adjk[q.front().first][i]]=true;
            }
        }
        q.pop();
    }
    if(q.empty()) cout<<-1<<'\n';
    return 0;
}