#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
struct data
{
int to, val;
};
int n, m, s;
int dis[101000];
int book[101000];
vector <data> g[1001000];
void dij(int s)
{
memset(dis, 0x3f, sizeof(dis));
for (int i = 0; i < g[s].size(); i++)
{
dis[g[s][i].to] = min(dis[g[s][i].to], g[s][i].val);
}
book[s] = 1;
for (int j = 0; j < n - 1; j++)
{
int minn = s;
int mn = inf;
for (int i = 1; i <= n; i++)
{
if (book[i] == 0 && mn > dis[i])
{
mn = dis[i];
minn = i;
}
}
book[minn] = 1;
for (int i = 0; i < g[minn].size(); i++)
{
if (book[g[minn][i].to] == 0 && dis[g[minn][i].to] > dis[minn] + g[minn][i].val)
{
dis[g[minn][i].to] = dis[minn] + g[minn][i].val;
}
}
}
}
int main()
{
int a, b, c;
cin >> n >> m >> s;
for (int i = 0; i < m; i++)
{
cin >> a >> b >> c;
data t;
t.to = b;
t.val = c;
g[a].push_back(t);
}
dij(s);
for (int i = 1; i <= n; i++)
{
if(i == s)
{
cout << 0 << " ";
continue;
}
if(dis[i] == inf)
{
cout << 2147483647 << ' ';
continue;
}
else
{
printf("%d ", dis[i]);
}
}
}