#include<iostream>
#include<stdio.h>
using namespace std;
//#define MAX 12
#define MAX 206
#define INF 1000002
int map[MAX][MAX];
int visited[MAX];
int cost[MAX];
int point,road;
int start,end;
int min(int a,int b)
{
if(a>b)
return b;
return a;
}
//初始化
void init()
{
int i,j;
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
map[i][j]=INF;
}
visited[i]=0;
cost[i]=INF;
}
}
//从已经访问过的集合当中,找到下一个可以访问的点
int noroad()
{
int i=0;int j=0;
for(i=0;i<point;i++)
{
if(visited[i]==1)
{
for(j=0;j<point;j++)
{
if(visited[j]==0&&map[i][j]!=INF)
{
return 0;
}
}
}
}
return 1;
}
void dij()
{
visited[start]=1;cost[start]=0;
while(!noroad())
{
//从s当中选择一个点,作为中间点,使得从start到T当中点
int i=0;int j=0;int tmin=INF;int tj;
for(i=0;i<point;i++)
{
if(visited[i]==1)
{
for(j=0;j<point;j++)
{
if(map[i][j]!=INF&&visited[j]==0)
{
if(tmin>cost[i]+map[i][j])
{
tmin=cost[i]+map[i][j];
tj=j;
}
}
}
}
}//for
visited[tj]=1;
cost[tj]=tmin;
//更新
for(i=0;i<point;i++)
{
if(visited[i]==0)
{
cost[i]=min(cost[i],cost[tj]+map[tj][i]);
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d %d",&point,&road)!=EOF)
{
//初始化
init();
//输入
int i=0;
for(i=0;i<road;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
if(map[x][y]>z)
{
map[y][x]=z;
map[x][y]=z;
}
}
scanf("%d %d",&start,&end);
//处理
dij();
if(cost[end]==INF)
{
cout<<"-1"<<endl;
}
else
{
cout<<cost[end]<<endl;
}
}
return 0;
}