#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int mmax=1003;
const int inf=99999999;
struct node
{
int en,len,next;
}E[mmax];
int p[mmax];
int n,m,e;
int dis[mmax],path[mmax];
bool inque[mmax];
void init()
{
e=0;
memset(p,-1,sizeof p);
memset(path,-1,sizeof path);
}
void add(int st,int en,int len)
{
E[e].en=en;
E[e].len=len;
E[e].next=p[st];
p[st]=e++;
}
void spfa(int st,int en)
{
int i,nst,nen,len;
for(i=0;i<=n;i++)
{
dis[i]=inf;
inque[i]=false;
}
queue<int>q;
dis[st]=0;
q.push(st);
inque[st]=true;
while(!q.empty())
{
nst=q.front();
q.pop();
inque[nst]=false;
for(i=p[nst];i!=-1;i=E[i].next)
{
nen=E[i].en;
len=E[i].len;
if(dis[nen]>dis[nst]+len)
{
path[nen]=nst;
dis[nen]=dis[nst]+len;
if(!inque[nen])
{
q.push(nen);
inque[nen]=true;
}
}
}
}
for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
puts("");
for(int i=1;i<=n;i++)
{
int t=i;
printf("%d: ",t);
while(path[t]!=-1)
{
printf("%d ",path[t]);
t=path[t];
}
puts("");
}
}
int main()
{
int st,en,len;
while(scanf("%d %d",&n,&m)!=EOF)
{
init();
while(m--)
{
scanf("%d %d %d",&st,&en,&len);
add(st,en,len);
add(en,st,len);
}
scanf("%d %d",&st,&en);
spfa(st,en);
}
return 0;
}