/*
O(V^2)
*/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int v,e;//顶点数
const int INF=1<<30;
const int max_v=1e4+5;
int d[max_v];//顶点s出发的最短距离
int cost[max_v][max_v];//边权值
bool used[max_v];//已经使用过的图
void dijkstra(int start)
{
fill(d,d+v,INF);
fill(used,used+v,false);
d[start]=0;
while(true)
{
int t=-1;
for(int u=0;u<v;u++)
{
if(!used[u]&&(t==-1||d[u]<d[t]))
t=u;
}
if(t==-1)
break;
used[t]=true;
for(int u=1;u<v;u++)
{
d[u]=min(d[u],d[t]+cost[t][u]);
}
}
}
int main()
{
cin>>v>>e;
for(int i=0;i<v;i++)
{
for(int j=0;j<v;j++)
cost[i][j]=INF;
}
int x,y,val;
for(int i=0;i<e;i++)
{
cin>>x>>y>>val;
cost[x][y]=val;
}
int start,End;
cin>>start>>End;
dijkstra(start);
for(int i=0;i<v;i++)
cout<<d[i]<<' ';
cout<<endl;
cout<< d[End]<<endl;
return 0;
}