#include <iostream>
#include <queue>
#define big long long
using namespace std;
big n,m,s,cnt=0;
big a,b,v;
big getto[200005],value[200005],nxt[200005],point[100005];
big dis[100005],vis[100005];
struct Node{
big val,point;
friend bool operator < (Node l,Node r)
{
return l.val > r.val;
}
}tmp;
priority_queue <Node> q;
void build(big a,big b,big v)
{
cnt++;
getto[cnt] = b;
value[cnt] = v;
nxt[cnt] = point[a];
point[a] = cnt;
}
void dijkstra()
{
for(big i = 1;i <= n;i++)
{
dis[i] = 2147483647;
}
dis[s] = 0;
tmp.point = s;
tmp.val = 0;
q.push(tmp);
while(!q.empty())
{
big u = q.top().point;
q.pop();
if(vis[u])
{
continue;
}
vis[u] = 1;
for(big i = point[u];i ;i = nxt[i])
{
if(dis[getto[i]] > dis[u]+value[i])
{
dis[getto[i]] = dis[u]+value[i];
tmp.val = dis[getto[i]];
tmp.point = getto[i];
q.push(tmp);
}
}
}
}
int main()
{
cin >> n >> m >> s;
for(big i = 1;i <= m;i++)
{
scanf("%lld %lld %lld",&a,&b,&v);
build(a,b,v);
}
dijkstra();
for(big i = 1;i <= n;i++)
{
printf("%lld ",dis[i]);
}
return 0;
}