#include <bits/stdc++.h>
using namespace std;
int n,m,poc,kraj,a,br;
struct slog{
    int sused,odakle;
    int cena;
    bool operator<(const slog &a)const{
        return cena>a.cena;}
}pom;
bool idx[200005];
int D[200005];
int res[200005];
vector <slog> v[200005];
priority_queue <slog> H;
void dikstra(int a){
    pom.sused=a;
    pom.odakle=0;
    pom.cena=0;
    H.push(pom);
    while(H.size()){
        pom=H.top();
        H.pop();

        if(idx[pom.sused])continue;
        idx[pom.sused]=true;
        D[pom.sused]=pom.cena;
        res[pom.sused]=pom.odakle;
        int x=pom.sused;
        int xcena=pom.cena;
        for(int i=0; i<v[x].size();i++){
            pom.sused=v[x][i].sused;
            if(idx[pom.sused])continue;
            if(v[x][i].cena!=xcena){
            pom.cena=xcena+1;
            }
            else{pom.cena=xcena;}
            pom.odakle=x;
            H.push(pom);
        }
    }
}
int main (){
    cin>>n>>m;
    cout<<setprecision(5)<<fixed;
    memset(res,0,sizeof (res));
    for(int i=1; i<=m; i++){
        cin>>a>>pom.sused>>pom.cena;
        v[a].push_back(pom);
        swap(a,pom.sused);
        v[a].push_back(pom);
    }
    cin>>poc>>kraj;
    dikstra(poc);
    cout<<D[kraj]<<endl;
/*
    br=kraj;
    stack<int>s;
    while(res[br]>0){
        s.push(br);
        br=res[br];
    }
    s.push(poc);
    while(s.size()){
        cout<<s.top()<<" ";
        s.pop();
    }
    */
return 0;
}