#include<bits/stdc++.h>
using namespace std;
bool visited[1000000];
bool pravi_visited[1000000];
int n;
vector<pair<int,int>> g[1000000];
int duzina[1000000];
int stanje[1000000];
int rastojanje[1000000];
vector<int> vektor;
void dfs(int x, int anc, int edg){
	if(visited[x]) return;
	else visited[x] = true;
	if(edg==0){
		if(stanje[anc]==0){
			duzina[x] = duzina[anc];
			stanje[x] = stanje[anc];
		}
		if(stanje[anc]==1){
			duzina[x] = duzina[anc]+1;
			stanje[x] = 0; 
		}
	}
	else{
		if(stanje[anc]==1){
			duzina[x] = duzina[anc];
			stanje[x] = stanje[anc];
		}
		if(stanje[anc]==0){
			duzina[x] = duzina[anc]+1;
			stanje[x] = 1; 
		}
	}
	for(auto u:g[x]){
		dfs(u.first, x, u.second);
	}
}
void pravi_dfs(int x, int duz, int edg,int anc){
	if(pravi_visited[x] && x!=anc) return;
	if(x!=anc) vektor.push_back(x);
	pravi_visited[x] = true;
	rastojanje[x] = duz;
	for(auto u:g[x]){
		if(u.second==edg) pravi_dfs(u.first,duz,edg, anc);
	}
}
int gvisited[1000000];
void gfs(int x){
	if(gvisited[x]) return;
	gvisited[x] = true;
	rastojanje[x] = 0;
	pravi_visited[x] = true;
	vektor.push_back(x);
	for(auto r:g[x]){
		if(r.second==0) gfs(r.first);
	}
}
bool pr[1000000];
void proveri(int x){
	if(pr[x]) return;
	pr[x] = true;
	for(auto r:g[x]){
		proveri(r.first);
	}
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int m;
	cin>>n>>m;
	bool st2 = true;
	for(int i=0;i<m;i++){
		int a,b,t;
		cin>>a>>b>>t;
		if(t==0) st2 = false;
		g[a].push_back({b,t});
		g[b].push_back({a,t});
	}
	int u,v;
	cin>>u>>v;
	proveri(u);
	if(!pr[v]){
		cout<<-1<<endl;
		return 0;
	}
	duzina[u] = 0;
	stanje[u] = 0;
	if(st2){
		dfs(u,u,0);
		if(visited[v]) cout<<1<<endl;
		else cout<<-1<<endl;
		return 0;
	}
	if(m==n-1){
		dfs(u,u,0);
		cout<<duzina[v];
		return 0;
	}
	gfs(u);
	int dist = 1;
	while(!pravi_visited[v]){
		int p;
		if(dist%2==1) p=1;
		else p = 0;
		vector<int> v1 = vektor;
		vektor.clear();
		for(auto x:v1){;
			pravi_dfs(x,dist,p,x);
		}
		dist++;
	}
	cout<<rastojanje[v];
	return 0;
}