#include<iostream>
using namespace std;
int map[205][205]; //保存道路信息
int mark[205]; //mark[i]==1 代表城市i被标星
int tolen[205]; //tolen[i]==x 代表起点城市到i城市的距离为x
void init(int X)//把数组初始化
{
for(int i=0;i<X;i++){
mark[i]=0;
tolen[i]=0xfffffff;
for(int j=0;j<X;j++){
if(i==j)map[i][j]=0; //自己到自己距离为0
else map[i][j]=0xfffffff; //其他的先默认无穷大 0xfffffff是int的最大值
}
}
}
int main()
{
int N,M;//如题
int city1,city2,road_len;//装输入数据
int from,to;//装输入数据
while(cin>>N>>M){
init(N);//初始化
for(int i=0;i<M;i++){
cin>>city1>>city2>>road_len;
if(map[city1][city2]>road_len){//两个城市可能有多条路径,取最短
map[city1][city2]=road_len;
map[city2][city1]=road_len;//道路是双向的
}
}
cin>>from>>to;
//dijkstra
//用城市from初始化一些数据
//dijkstra
mark[from]=1;//起始点首先标星
for(int i=0;i<N;i++){
tolen[i]=map[from][i];//用起始点松弛tolen数组
}
//从tolen数组找没被标记并且值最小的点,然后将它标星,用它松弛tolen数组
while(1){
int which=-1;
int which_len=0xfffffff;
for(int i=0;i<N;i++){
if(mark[i]==1)continue;
if(which_len>tolen[i]){
which_len=tolen[i];
which=i;
}
}
if(which!=-1){ //如果仍然有可标点 开始用它松弛
mark[which]=1;//标记这个点
for(int i=0;i<N;i++){
//注意map[which][i]为0xfffffff意味着which不可达i
if(mark[i]==0 &&map[which][i]!=0xfffffff &&tolen[i]>tolen[which]+map[which][i]){
tolen[i]=tolen[which]+map[which][i];
}
}
}
else
{
break;
}
}
if(tolen[to]==0xfffffff)cout<<-1<<endl;
else cout<<tolen[to]<<endl;
//floyd
/*for(int k=0;k<N;k++){ //用结点k松弛
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(map[i][k]+map[k][j]<map[i][j]){
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
if(map[from][to]==0xfffffff)cout<<-1<<endl;
else cout<<map[from][to]<<endl;*/
}
return 0;
}