#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define pa pair<int,int>
#define maxn 115
using namespace std;
int n,m,s;
int dis[maxn],vis[maxn],pathpre[maxn];
vector<int> v[maxn],w[maxn];
priority_queue< pa,vector<pa>,greater<pa> > q;
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘) flag=0; ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘) {X=(X<<1)+(X<<3)+ch-‘0‘; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(int X)
{
if(X<0) {X=~(X-1); putchar(‘-‘);}
if(X>9) write(X/10);
putchar(X%10+‘0‘);
}
void Dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int rt=q.top().second;
q.pop();
if(vis[rt]) continue;
vis[rt]=1;
for(int i=0;i<v[rt].size();i++){
int to=v[rt][i];
if(dis[to]>dis[rt]+w[rt][i]){
dis[to]=dis[rt]+w[rt][i];
pathpre[to]=rt;
q.push(make_pair(dis[to],to));
}
}
}
}
bool flagfinish=false;
void path_out(int rt){//最差时间复杂度:O(mlogm+n^2)
if(rt==s){
write(rt);printf(" ");
flagfinish=true;
return;
}
// for(int i=0;i<v[rt].size();i++)
// if(dis[v[rt][i]]==dis[rt]+w[rt][i]){ 错
// path_out(v[rt][i]);
// write(rt);printf(" ");
// return;
// }
path_out(pathpre[rt]);write(rt);printf(" ");
}
int main()
{
freopen("djs.in","r",stdin);
freopen("djs.out","w",stdout);
n=read(),m=read(),s=read();
for(int i=1,x,y,z;i<=m;i++)
{
x=read(),y=read(),z=read();
v[x].push_back(y);w[x].push_back(z);
}
Dijkstra();
for(int i=0;i<n;i++)
{
write(i);puts(":");
if(dis[i]==inf||i==s) puts("no");
else
{
printf("path:");path_out(i);printf("\n");
printf("cost:%d\n",dis[i]);flagfinish=false;
}
}
return 0;
}