#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; }