#include<stdio.h>
#include<stdlib.h>
#define max 100000000
int d[1000][1000],path[1000][1000];
int main()
{
int i,j,k,m,n;
int x,y,z;
int sta,end;
scanf("%d%d",&m,&n); //m为结点数,n为边数
//邻接矩阵和路径矩阵初始化化
for(i=1;i<=m;i++){
for(j=1;j<=m;j++)
{
d[i][j]=max;
path[i][j]=j;
}
}
//读入边信息
for(i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&z);
d[x][y]=z;
d[y][x]=z;
}
//算法的核心部分,注意循环嵌套的顺序
for(k=1;k<=m;k++)
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
{
if(d[i][k]+d[k][j]<d[i][j]){
d[i][j]=d[i][k]+d[k][j];
path[i][j]=path[i][k];
}
}
scanf("%d%d",&sta,&end); //sta为起点,end为终点
for(i=1;i<=m;i++){
for(j=1;j<=i;j++){
if(i!=j)
printf("%d->%d:%d\n",i,j,d[i][j]);
}
}
i=sta;
while(sta!=end){
printf("%d->",sta);
sta=path[sta][end];
}
printf("%d:%d",end,d[i][end]);
system("pause");
return 0;
}