#include <bits/stdc++.h>
#define pb push_back
#define maxn 20050
#define fi first
#define se second

using namespace std;

int n, m, a, b, w, poc, kraj;
vector<vector<pair<int,int>>> v;
bool bio[maxn];
bool ima[maxn];
int d[maxn];
int r0[maxn];
int r1[maxn];

int main()
{
    cin >> n >> m;
    for(int i=0; i<maxn; i++){
        v.pb({});
        r0[i]=maxn;
        r1[i]=maxn;
        d[i]=maxn;
        ima[i]=false;
        bio[i]=false;
    }
    for(int i=0; i<m; i++){
        cin >> a >> b >> w;
        v[a].pb({b,w});
        v[b].pb({a,w});
    }
    cin >> poc >> kraj;
    d[kraj]=0;
    r1[poc]=1;
    r0[poc]=0;
    // BFS
    queue<int> q;
    q.push(kraj);
    while(!q.empty()){
        int x=q.front();
        q.pop();
        bio[x]=true;
        for(auto u:v[x]){
            if(!bio[u.fi]){
                if(!ima[u.fi]){
                    q.push(u.fi);
                    ima[u.fi]=true;
                    d[u.fi]=d[x]+1;
                }
            }
        }
    }
    if(d[poc]==maxn){
        cout << -1 << "\n";
        return 0;
    }

    for(int i=0; i<maxn; i++){
        bio[i]=false;
        ima[i]=false;
    }
    priority_queue<pair<int,int>> pq;
    pq.push({d[poc],poc});
    while(!pq.empty()){
        pair<int,int> x=pq.top();
        pq.pop();
        bio[x.se]=true;
        for (auto u:v[x.se]){
            if(!bio[u.fi]){
                if(!ima[u.fi]){
                    pq.push({d[u.fi],u.fi});
                    ima[u.fi]=true;
                }
                if(u.se==0){
                    r0[u.fi]=min(r0[x.se],r0[u.fi]);
                    r1[u.fi]=min(r0[x.se]+1,r1[u.fi]);
                }
                else{
                    r1[u.fi]=min(r1[u.fi],r1[x.se]);
                    r0[u.fi]=min(r0[u.fi],r1[x.se]+1);
                }
            }
        }
    }
    cout << min(r0[kraj],r1[kraj]) << "\n";
}