#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
#define endl '\n'
#define double long double
//#define int long long
#define mod 1000000007
#define ll long long
int32_t main()
{
#ifndef ONLINE_JUDGE
freopen("int.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int n,M;
cin>>n>>M;
vector<vector<pair<int,int>>> g(n+1);
for(int i = 1;i <= M;i++)
{
int u,v,c;
cin>>u>>v>>c;
g[u].push_back({v,c});
g[v].push_back({u,c});
}
deque<int> q;
int s,t;
cin>>s>>t;
vector<int> vis(n+1,0);
vis[s] = 1;
vector<int> cost(n+1,1e7);
cost[s] = 0;
vector<set<int>> clr(n+1);
for(auto it:g[s])
{
cost[it.first] = 0;
q.push_back(it.first);
clr[it.first].insert(it.second);
}
while(!q.empty())
{
int p = q.front();
q.pop_front();
if(p == t)
break;
if(vis[p])
continue;
vis[p] = 1;
for(auto it:g[p])
{
if(!vis[it.first])
{
if(clr[p].find(it.second)!=clr[p].end())
{
if(cost[it.first] > cost[p])
{
clr[it.first].clear();
clr[it.first].insert(it.second);
}
else
if(cost[it.first] == cost[p])
{
clr[it.first].insert(it.second);
}
cost[it.first] = min(cost[it.first],cost[p]);
q.push_front(it.first);
}
else
{
if(cost[it.first] > cost[p] + 1)
{
clr[it.first].clear();
clr[it.first].insert(it.second);
}
else
if(cost[it.first] == cost[p] + 1)
{
clr[it.first].insert(it.second);
}
cost[it.first] = min(cost[it.first],cost[p] + 1);
q.push_back(it.first);
}
}
}
}
cout<<cost[t];
return 0;
}