#include<iostream>
#include<cstring>
using namespace std;
const int N=1010;
int map[N][N],dist[N],num[N];
int n,e;
bool dijkstra(int s)
{
int i,j,minpath,minpoint,pos;
int used[N];
memset(used,0,sizeof(used));
for(i=1;i<=n;i++)
{
num[i]=s;
dist[i]=map[s][i];
}
used[s]=1;
num[s]=-1;
pos=s;
for(i=1;i<n;i++)
{
minpoint=0;
minpath=0;
for(j=1;j<=n;j++)
if(used[j]==0&&dist[j]!=0&&(minpath==0||minpath>=dist[j]))
{
minpoint=j;
minpath=dist[j];
pos=j;
}
if(minpoint==0)
return false;
if(minpoint==e)
return true;
used[minpoint]=1;
for(j=1;j<=n;j++)
if(used[j]==0&&map[minpoint][j]!=0&&(dist[j]==0||dist[j]>=dist[minpoint]+map[minpoint][j]))
{
dist[j]=dist[minpoint]+map[minpoint][j];
num[j]=pos;
}
}
return true;
}
void dsf(int i)
{
if(i!=-1)
{
dsf(num[i]);
cout<<i<<" ";
}
}
int main()
{
int m,s,i,x,y,len;
while(cin>>n>>m>>s>>e)
{
memset(num,0,sizeof(num));
memset(map,0,sizeof(map));
for(i=1;i<=m;i++)
{
cin>>x>>y>>len;
if(map[x][y]==0||map[x][y]>len)
{
map[x][y]=len;
map[y][x]=len;
}
}
if(dijkstra(s))
{
cout<<dist[e]<<endl;
i=s;
dsf(e);
cout<<endl;
}
else
{
cout<<"can't arrive"<<endl;
}
}
return 0;
}
/**************************************************************
Problem: 2047
User: admin
Language: C++
Result: Accepted
Time:266 ms
Memory:6068 kb
****************************************************************/