#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,s;
int dis[N],vis[N],head[N],num=1;
struct nn{
int u,v,w;
}edge[N];
void read(int &ss){
char ch;
while(ch=getchar(),!isdigit(ch));
ss=ch-48;
while(ch=getchar(),isdigit(ch))ss=ss*10+ch-48;
}
inline void add(int u,int v,int w){
edge[++num].u=head[u];
head[u]=num;
edge[num].v=v;
edge[num].w=w;
}
inline void dijkstra(int s){
memset(dis,0x3f3f3f3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
priority_queue< pair<int,int> > q;
q.push(make_pair(0,s));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=edge[i].u){
int &v=edge[i].v;
if(dis[v]<dis[u]+edge[i].w)continue;
dis[v]=dis[u]+edge[i].w;
q.push(make_pair(-dis[v],v));
}
}
}
int main(){
read(n);read(m);read(s);
for(int i=1;i<=m;i++){
int u,v,w;
read(u);read(v);read(w);
if(u==v)continue;
add(u,v,w);
}
dijkstra(s);
dis[s]=0;
for(int i=1;i<=n;i++)printf("%d ",dis[i]);
return 0;
}