#include <cstdio>
#include <queue>
#include <algorithm>
#include <iostream>
#define INF 2147483647
using namespace std;
struct node{
int dis;
int to;
int next;
};node map[500010];
int tot;
int head[100010];
void add(int from,int to,int dis){
tot++;
map[tot].dis=dis;
map[tot].to=to;
map[tot].next=head[from];
head[from]=tot;
}
int dis[100010];
int start;
int n,m;
struct Node{
int num;
int Dis;
bool operator <(const Node& temp)const{
return Dis>temp.Dis;
}
};
void Dj(){
for(int i=1;i<=n;i++){
dis[i]=INF;
}
dis[start]=0;
priority_queue<Node> q;
q.push((Node){start,0});
while(q.size()){
Node first=q.top();
q.pop();
int beginning=first.num;
int distance=first.Dis;
if(dis[beginning]!=distance) continue;
for(int i=head[beginning];i;i=map[i].next){
int ending=map[i].to;
int weight=map[i].dis;
if(dis[beginning]+weight<dis[ending]) {
dis[ending]=dis[beginning]+weight;
q.push((Node){ending,dis[ending]});
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&start);
for(int i=1;i<=m;i++){
int X,Y,Z;
scanf("%d%d%d",&X,&Y,&Z);
add(X,Y,Z);
}
Dj();
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
return 0;
}