#include <bits/stdc++.h>
using namespace std;
const int N=1e5+3;
int n,m,s,d[N],vis[N];
struct E{
int to,dis;
};
vector<E>edge[N];
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int from,to,w;
scanf("%d%d%d",&from,&to,&w);
edge[from].push_back({to,w});
}
for(int i=1;i<=n;i++){
if(i==s)d[i]=0;
else d[i]=0x7fffffff;
}
priority_queue<int,vector<int>,greater<int>>q;
q.push(s);
while(!q.empty()){
int x=q.top();q.pop();
if(vis[x])
continue;
vis[x]=1;
for(int i=0;i<edge[x].size();i++){
if(d[edge[x][i].to]>d[x]+edge[x][i].dis){
d[edge[x][i].to]=d[x]+edge[x][i].dis;
if(!vis[edge[x][i].to])q.push(edge[x][i].to);
}
}
}
for(int i=1;i<=n;i++)
printf("%d ",d[i]);
return 0;
}