#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<ctime>
#include<queue>
#include<vector>
using namespace std;
const int N=200005;
int n,m,s,tot,Next[N],head[N],to[N];
bool vis[N];
long long dis[N],val[N];
void add(int x,int y,long long z){
tot++;
to[tot]=y;
val[tot]=z;
Next[tot]=head[x];
head[x]=tot;
}
struct Node{
int id;
long long dis;
bool operator <( const Node &x)const{
return x.dis < dis;
}
};
priority_queue<Node> Q;
void dijkstra(){
for(int i=1;i<=n;i++){
dis[i]=2147483647;
vis[i]=0;
}
dis[s]=0;
Q.push((Node){s,0});
while(!Q.empty()){
Node u=Q.top();
Q.pop();
if(vis[u.id]){
continue;
}
vis[u.id]=1;
for(int i=head[u.id];i;i=Next[i]){
int v=to[i];
if(dis[v]>dis[u.id]+val[i]){
dis[v]=dis[u.id]+val[i];
if(!vis[v]){
Q.push((Node){v,dis[v]});
}
}
}
}
return;
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int u,v;
long long w;
cin>>u>>v>>w;
add(u,v,w);
}
dijkstra();
for(int i=1;i<=n;i++){
printf("%lld ",dis[i]);
}
return 0;
}