#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,x,y,z,s,t,id,val,to,dis[100005];
bool vis[100005];
struct node{
ll id,val;
};
struct nodee{
ll dis,to;
bool operator<(const nodee &a) const
{
return dis>a.dis;
}
};
vector<node> a[100005];
priority_queue<nodee> q;
nodee p;
int main()
{
scanf("%lld%lld%lld",&n,&m,&s);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
a[x].push_back(node{y,z});
a[y].push_back(node{x,z});
}
memset(dis,1,sizeof dis);
dis[s]=0;
q.push(nodee{0,s});
while(!q.empty())
{
p=q.top(); q.pop();
if(vis[p.to]) continue;
vis[p.to]=true;
to=p.to;
for(int j=0;j<a[to].size();j++)
{
id=a[to][j].id;
val=a[to][j].val;
if(!vis[id]&&dis[to]+val<dis[id])
{
dis[id]=dis[to]+val;
q.push(nodee{dis[id],id});
}
}
}
for(int i=1;i<=n;i++)
printf("%lld ",dis[i]);
return 0;
}