#include <bits/stdc++.h>
using namespace std;
const int N=2*1e5+50;
const int inf=1e9+50;
vector<pair<int,int>>E[N];
int dist[N][2];
bool was[N][2];
/*vector<int>E0[N];
vector<int>E1[N];
int dp[N][2];
bool was[N][2];
void DFS(int u,int t)
{
	was[u][t]=true;
	if(t==0)
	{
		for(auto i:E0[u])
		{
			if(was[i][t]==true) continue;
			dp[i][t]=dp[u][t];
			DFS(i,t);
		}
		for(auto i:E1[u])
		{
			if(was[i][t])
		}
	}
}*/
int main()
{
    int n,m;
    scanf("%i%i",&n,&m);
    for(int i=1;i<=m;i++)
	{
		int a,b,t;
		scanf("%i%i%i",&a,&b,&t);
		E[a].push_back({b,t});
		E[b].push_back({a,t});
		/*if(t==0)
		{
			E0[a].push_back(b);
			E0[b].push_back(a);
		}
		else
		{
			E1[a].push_back(b);
			E1[b].push_back(a);
		}*/
	}
	int u,v;
	scanf("%i%i",&u,&v);
	for(int i=1;i<=n;i++)
	{
		dist[i][0]=inf;
		dist[i][1]=inf;
	}
	priority_queue<pair<int,pair<int,int>>>pq;
	pq.push({0,{u,0}});
	while(!pq.empty())
	{
		int d=-pq.top().first,a=pq.top().second.first,t=pq.top().second.second;
		pq.pop();
		if(was[a][t]==true) continue;
		was[a][t]=true;
		dist[a][t]=min(dist[a][t],d);
		for(auto i:E[a])
		{
			int x=i.first,y=i.second;
			if(y==t)
			{
				pq.push({-d,{x,t}});
			}
			else
			{
				pq.push({-(d+1),{x,1-t}});
			}
		}
	}
	printf("%i\n",min(dist[v][0],dist[v][1]));
    return 0;
}