#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<stdlib.h>
//#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
const int inf=0x3f3f3f3f;
int n,m,dis[maxn],head[maxn],len;
bool vis[maxn];
struct edge{ //链式前向星所需的数据结构
int to,val,next;
}e[maxn];
void add(int from,int to,int val){
e[len].to=to; //链式前向所需的加边
e[len].val=val;
e[len].next=head[from];
head[from]=len++;
}
struct point{ //构造点的数据结构,为跑priority准备
int val,id;
point(int id,int val){
this->id=id;
this->val=val;
}
bool operator <(const point &x)const{
return val>x.val;
}
};
void dijkstra(int s){
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)dis[i]=inf;
priority_queue<point> q;
q.push(point(s,0));
dis[s]=0;
while(!q.empty()){
int cur=q.top().id;
q.pop();
if(vis[cur]) continue;
vis[cur]=true;
for(int i=head[cur];i!=-1;i=e[i].next)
{
int id=e[i].to;
if(!vis[id] && dis[cur]+e[i].val < dis[id])
{
dis[id]=dis[cur]+e[i].val;
q.push(point(id,dis[id]));
}
}
}
}
int main(){
while(cin>>n>>m){
len=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++) //加边
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
add(from,to,val);
add(to,from,val);
}
int s,t;
cin>>s>>t; //源点,目的地
dijkstra(s);
if(dis[t]==inf)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0;
}