#include <bits/stdc++.h>
using namespace std;
struct node{
int to, w;
};
vector < node > g[100005];
int dis[100005];
bool vis[100005];
int n, m, sx;
int main()
{
cin >> n >> m >> sx;
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
memset(dis, 0x3f3f3f, sizeof dis);
dis[sx] = 0;
for (int i = 1; i < n; i++)
{
int x = 0;
for (int j = 1; j <= n; j++)
{
if (!vis[j] && dis[j] < dis[x])
x = j;
}
vis[x] = 1;
for (auto e : g[x])
{
if (!vis[e.to]) dis[e.to] = min(dis[e.to], dis[x] + e.w);
}
}
for (int i = 1; i <= n; i++)
cout << dis[i] << " ";
return 0;
}