#include<queue>
#include<cstring>
using namespace std;
#define ll long long
struct edge
{
int to,w,next;
};
edge e[500005];
int head[10005];
int cnt=0;
struct node
{
int d,l;
bool operator < (const node & a) const
{
return l<a.l;
}
};
void ad(int u,int v, int w)
{
e[cnt].to=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
cnt++;
}
priority_queue<node>q;
int main()
{
memset(head,-1,sizeof(head));
int n,m,s;
cin>>n>>m>>s;
int u,v,w;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
ad(u,v,w);
}
int dis[10005];
bool vis[10005];
memset(dis,0x7f,sizeof(dis));
dis[s]=0;
q.push(node{s,0});
node tmp;
while(!q.empty())
{
tmp=q.top();
q.pop();
int u=tmp.d;
if(vis[u])
{
continue;
}
vis[u]=1;
dis[u]=tmp.l;
for(int i=head[u],v,w;i>=-2;i=e[i].next)
{
v=e[i].to;
w=e[i].w;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
// cout<<dis[v]<<" "<<endl;
q.push(node{v,dis[v]});
}
if(i==-1)
{
break;
}
}
}
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
return 0;
}