#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long int ll;
const int maxn=100005;
int n,m,s,tot,dis[maxn],head[maxn];
struct node{
int to,nxt;
int w;
}t[maxn];
bool vis[maxn];
inline void add(const int x,const int y,const int z){
t[++tot].to=y;t[tot].w=z;
t[tot].nxt=head[x];head[x]=tot;
}
queue<int>q;
inline void spfa(const int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
q.push(s);
vis[s]=1;
while(q.size()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=t[i].nxt){
int y=t[i].to,z=t[i].w;
if(dis[y]>dis[x]+z){
dis[y]=dis[x]+z;
q.push(y);
vis[y]=1;
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
spfa(s);
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
return 0;
}