1 #include <bits/stdc++.h>
2 #define For(i,j,k) for(int i=j;i<=k;i++)
3 #define Dow(i,j,k) for(int i=j;i>=k;i--)
4 #define LL long long
5 using namespace std ;
6 inline int read() {
7 int x = 0, f = 1;
8 char ch = getchar();
9 while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
10 while(ch>='0'&&ch<='9') { x = x * 10+ch-48; ch = getchar(); }
11 return x * f;
12 }
13 inline void write(LL x) {
14 if( x < 0 ) putchar('-');
15 if( x > 9 ) write(x/10);
16 putchar(x%10+48);
17 }
18 const int N = 10011, M = 500011;
19 const LL INF = 1e16;
20 int n, m, S, nedge;
21 int head[N], vis[N];
22 LL dist[N];
23 struct edge{
24 int to, pre, val;
25 }e[M];
26 struct node{
27 int id;
28 LL val;
29 friend bool operator <(node a, node b) {
30 return a.val > b.val;
31 }
32 };
33 priority_queue<node> Q;
34 inline void add(int x, int y, int v) {
35 e[++nedge] = (edge){y, head[x], v};
36 head[x] = nedge;
37 }
38 void Dijkstra(int S) {
39 For(i, 0, n) dist[i] = INF;
40 For(i, 0, n) vis[i] = 0;
41 dist[S] = 0;
42 while(!Q.empty()) Q.pop();
43
44 Q.push((node){S, 0});
45 while(!Q.empty()) {
46 node p = Q.top(); Q.pop();
47 int u = p.id;
48 if(vis[u]) continue;
49 vis[u] = 1;
50 for(int i=head[u]; i; i=e[i].pre) {
51 int v = e[i].to;
52 if(dist[u]+e[i].val < dist[v]) {
53 dist[v] = dist[u]+e[i].val;
54 Q.push((node){v, dist[v]});
55 }
56 }
57 }
58 }
59
60 int main() {
61 n = read(); m = read(); S = read();
62 For(i, 1, m) {
63 int x=read(), y=read(), v=read();
64 add(x, y, v);
65 }
66 Dijkstra(S);
67 For(i, 1, n)
68 if(dist[i] != INF) write(dist[i]), putchar(' ');
69 else printf("2147483647 ");
70 return 0;
71 }