```cpp
#include<bits/stdc++.h>
using namespace std;
struct Edge{int next,to,dis;}e[200010];
int head[200010],cnt;
void addedge(int from,int to,int dis){
e[cnt].next=head[from];
e[cnt].to=to;
e[cnt].dis=dis;
head[from]=cnt++;
return ;
}
int n,m,s;
#define pi pair<int,int>
long long dis[100010];
int vis[100010];
void dijkstra(){
memset(vis,0,sizeof vis);
memset(dis,0x3f,sizeof dis);
priority_queue<pi,vector<pi>,greater<pi> > q;
dis[s]=0;vis[s]=1;
q.push(make_pair(0,s));
while(q.size()){
int x=q.top().second;
q.pop();
for(int i=head[x];~i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis){
dis[y]=dis[x]+e[i].dis;
if(!vis[y])
q.push(make_pair(dis[y],y)),vis[y]=1;
}
}
}
return ;
}
int main(){
memset(head,-1,sizeof head);
scanf("%d%d%d",&n,&m,&s);
while(m--){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
}
dijkstra();
for(int i=1;i<=n;i++) printf("%lld ",dis[i]);
return 0;
}