#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define F first
#define S second
using namespace std;
const int N=200010;
vector<pair<int, int>> adj[N];
bool mark[N];
int node1; int node2;
int ans=0;
vector<int> lista[N];
bool exs(int node){
	mark[node]=true;
	if(node==node2){
		return true;
	}
	else{
		for(int i=0; i<adj[node].size(); i++){
			if(!mark[adj[node][i].F]){
				if(exs(adj[node][i].F)){
					return true;
				}
			}
		}
		return false;
	}
}

void dfs(int node, int depth, int dod){
	if(node==node2){
		ans=depth;
	}
	mark[node]=true;
	if(dod==1){
		lista[depth].pb(node);
	}
	if(depth%2==0){
		for(int i=0; i< adj[node].size(); i++){
			if(!mark[adj[node][i].F] && adj[node][i].S==0){
				dfs(adj[node][i].F, depth, 1);
			}
		}
	}
	else{
		for(int i=0; i< adj[node].size(); i++){
			if(!mark[adj[node][i].F] && adj[node][i].S==1){
				dfs(adj[node][i].F, depth, 1);
			}
		}
	}
}
int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	for(int i=0; i< m; i++){
		int x, y, z;
		scanf("%d %d %d", &x, &y, &z);
		adj[y].pb(mp(x, z));
		adj[x].pb(mp(y, z));
	}
	scanf("%d %d", &node1, &node2);
	if(node1==node2){
		printf("%d", 0);
		return 0;
	}
	if(exs(node1)){
		for(int i=1; i<=n; i++){
			mark[i]=false;
		}
		dfs(node1, 0, 1);
		for(int i=0; i< n; i++){
			for(int j=0; j<lista[i].size(); j++){
				dfs(lista[i][j], i+1, 0);
				if(ans!=0){
					printf("%d", ans);
					return 0;
				}
			}
		}
	}
	else{
		printf("%d", -1);
	}
}