#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;
}