#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define pb push_back
#define mem(a,x) memset(a,x,sizeof(a))
struct node
{
int x, dis;
bool operator < (const node &p) const
{
return p.dis < dis;
}
};
int n, m, s;
vector<node>e[100010];
int vis[100010];
int dis[100010];
priority_queue<node>q;
void Dij()
{
dis[s] = 0;
q.push((node){s,0});
while(!q.empty())
{
node a = q.top();
q.pop();
int x = a.x;
if(vis[x]) continue;
vis[x] = 1;
for(int i = 0; i < e[x].size(); i++)
{
node y = e[x][i];
if(!vis[y.x]&&dis[y.x]>dis[x]+y.dis){
dis[y.x] = dis[x]+y.dis;
q.push((node){y.x,dis[y.x]});
}
}
}
}
int main()
{
mem(vis,0);
mem(dis,INF);
cin >> n >> m >> s;
int u, v, w;
for(int i = 0; i < m; i++)
{
cin >> u >> v >> w;
e[u].pb((node){v,w});
}
Dij();
for(int i = 1; i <= n; i++) cout << dis[i] << " ";
return 0;
}