#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+99,M=1e6+99;
int n,m,s,t;
struct edge{
int v,w,nxt;
}edg[M*2];
int hd[N],cntedge=1;
void add(int u,int v,int w){
++cntedge;
edg[cntedge]=(edge){v,w,hd[u]};
hd[u]=cntedge;
}
struct node{
int u; ll dis;
bool operator <(const node&A) const{
return dis>A.dis;
}
};
ll d[N];
void dij(){
memset(d,0x3f3f3f,sizeof(d));
priority_queue<node> que;
d[s]=0; que.push((node){s,d[s]});
node now; int u,v,w;
while(!que.empty()){
now=que.top(); que.pop();
u=now.u; if(d[u]!=now.dis) return;
for(int i=hd[u];i;i=edg[i].nxt){
v=edg[i].v; w=edg[i].w;
if(d[v]<=d[u]+w) continue;
d[v]=d[u]+w; que.push((node){v,d[v]});
}
}
return;
}
int dfn[N],low[N],timer,idfn[N];
void dfs(int u,int eid){
dfn[u]=low[u]=++timer; idfn[timer]=u;
int v;
for(int i=hd[u];i;i=edg[i].nxt){
if((i^1)==eid) continue;
v=edg[i].v;
if(dfn[v]) low[u]=min(low[u],dfn[v]);
else dfs(v,i),low[u]=min(low[u],low[v]);
}
return;
}
void dfss(int u,int dis){
d[u]=dis;
int v,w;
for(int i=hd[u];i;i=edg[i].nxt){
v=edg[i].v; w=edg[i].w;
if(w!=1||d[v]) continue;
dfss(v,dis+1);
}
}
int fro[N],bac[N];
ll f[N][4];
void chkmn(ll &x,ll y){
if(y<x) x=y;
return;
}
void solve(){
dfss(s,1);
int u,v,w;
for(int i=1;i<=n;i++){
for(int j=hd[i];j;j=edg[j].nxt){
v=edg[j].v; w=edg[j].w;
if(w==1) continue;
v=d[v]; u=d[i];
if(v>u) bac[u]=w;
else fro[u]=1;
}
}
memset(f,0x3f3f,sizeof(f));
f[1][0]=f[1][1]=f[1][2]=f[1][3]=0;
for(int i=1;i<=n;i++){
if(fro[i+1]){
chkmn(f[i+1][0],f[i][0]+1);
chkmn(f[i+1][2],f[i][1]+1);
chkmn(f[i+1][1],f[i][2]+1);
chkmn(f[i+1][3],f[i][3]+1);
}
else{
chkmn(f[i+1][1],f[i][0]+1);
chkmn(f[i+1][3],f[i][1]+1);
}
if(bac[i]){
chkmn(f[i+2][0],f[i][0]+bac[i]);
if(fro[i+1]) chkmn(f[i+2][0],f[i][1]+bac[i]);
if(fro[i+1]) chkmn(f[i+2][0],f[i][2]+bac[i]);
}
}
ll ans=f[n][0];
cout<<ans;
return;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
int u,v,w,ww,b=1;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
if(i==1) ww=w;
else if(ww!=w) b=0;
add(u,v,w);
add(v,u,w);
}
cin>>s>>t;
dfs(s,0);
u=t;
while(low[u]!=dfn[u])
u=idfn[low[u]];
if(u!=s)
cout<<-1;
else{
if(b) dij(),cout<<d[t];
else solve();
}
return 0;
}