//dijkstra算法求最短路:
#include<bits/stdc++.h>
using namespace std;
#define N 3000
const int INF=0x3f3f3f3f;
int dis[N],vis[N],edge[N][N],pre[N];
int a,b,w,s,t,n,m; //w为权重,s,t分别为指定的求最短路的起点和终点;
int main()
{
void search(int x);
void dijkstra();
memset(vis,0,sizeof(vis));
cin>>n>>m>>s>>t;
//n个顶点,m条边,s为起点 ,t终点;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
edge[i][j]=0;
else edge[i][j]=INF;
}
}
for(int i=1;i<=m;i++)
{
cin>>a>>b>>w;
edge[a][b]=edge[b][a]=w;
}
dijkstra();
search(t);
return 0;
}
void dijkstra()
{
vis[s]=1;
for(int i=1;i<=n;i++)
{
dis[i]=edge[s][i]; //dis数组存储起始点s到其他顶点的距离;
pre[i]=s;
}
for(int i=1;i<n;i++) //寻找n-1条路经
{
int min1=INF,u;
for(int j=1;j<=n;j++) //寻找距离源点s最近的顶点u作为中间结点
{
if(!vis[j]&&dis[j]<min1)
{
min1=dis[j];
u=j;
}
}
vis[u]=1;
for(int k=1;k<=n;k++) //以u作为中间节点
{
if(!vis[k]&&dis[u]+edge[u][k]<dis[k])
{
dis[k]=dis[u]+edge[u][k];
pre[k]=u;
}
}
}
printf("%d\n",dis[t]);
}
//输出最短路径,递归:
void search(int x)
{
if(x==s)
{
printf("%d",x);
return;
}
search(pre[x]);
printf("->%d",x);
}