#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
****************************************************************/