#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int S(int x){
    return x*x/2+x/2+x%2;
}
int N,l;
int index_of(int a,int b){
    if(b>a) swap(a,b);
    return b+l-S(N-a);
}
int main(){
    int M;
    cin>>N>>M;
    l=S(N);
    bool* prohodno=new bool[l];
    bool* sa_ledom=new bool[l];
    for(int i=0;i<l;i++)
        sa_ledom[i]=prohodno[i]=false;
    for(int i=0;i<M;i++){
        int a,b,c;
        cin>>a>>b>>c;
        a--;
        b--;
        prohodno[index_of(a,b)]=true;
        sa_ledom[index_of(a,b)]=(bool)c;
    }
    int p,k;
    cin>>p>>k;
    p--;
    k--;
    int izlaz=0;
    bool stanje=false;
    vector<int> prevTacke;
    int tacka=p;
    int lookFrom=0;
    while(tacka!=k){
        bool pronadjenPut=false;
        int last=0;
        for(int i=lookFrom;i<N;i++)
            if(prohodno[index_of(tacka,i)]) last=i;
        for(int i=lookFrom;i<N;i++){
            if(!prohodno[index_of(tacka,i)]) continue;
            if(stanje==sa_ledom[index_of(tacka,i)]){
                pronadjenPut=true;
                prevTacke.push_back(tacka);
                tacka=i;
                continue;
            }
            if(!pronadjenPut&&i==last){
                pronadjenPut=true;
                stanje=!stanje;
                izlaz++;
                prevTacke.push_back(tacka);
                tacka=last;
            }
        }
        if(!pronadjenPut){
            if(prevTacke.size()>0&&tacka!=N-1){
                lookFrom=tacka+1;
                tacka=prevTacke[prevTacke.size()-1];
                prevTacke.pop_back();
            }else{
                izlaz=-1;
                break;
            }
        }
    }
    cout<<izlaz<<endl;
    return 0;
}