#include<bits/stdc++.h>
using namespace std;
int dist[10005],visit[10005];
int n,m,s;
struct node{
int s1;
int side;
};
void init(){
for(int i=1;i<=n;i++){
dist[i]=0xfffffff;
visit[i]=0;
}
}
vector<node>mp[10005];
void spfa(){
queue<int>v;
visit[s]=1;
v.push(s);
dist[s]=0;
while(!v.empty()){
int q=v.front();
v.pop();
visit[q]=0;
for(int i=0;i<mp[q].size();i++){
if(dist[mp[q][i].s1]>dist[q]+mp[q][i].side){
dist[mp[q][i].s1]=dist[q]+mp[q][i].side;
if(visit[mp[q][i].s1]) continue;
}
v.push(mp[q][i].s1);
}
}
}
signed main(){
cin>>n>>m>>s;
init();
for(int i=1;i<=m;i++){
node h;
int u,v,w;
cin>>u>>v>>w;
h.s1=v;
h.side=w;
mp[u].push_back(h);
}
spfa();
for(int i=1;i<=n;i++){
cout<<dist[i]<<' ';
}
cout<<endl;
return 0;
}
求调