#include <bits/stdc++.h>
using namespace std;
const long long INF = LLONG_MAX;
// Dijkstra: znajdź najkrótsze odległości od wierzchołka startowego 's'
vector<long long> dijkstra(int n, vector<vector<pair<int,int>>> &adj, int s) {
vector<long long> dist(n, INF);
dist[s] = 0;
// priority_queue: (odległość, wierzchołek)
priority_queue<pair<long long,int>, vector<pair<long long,int>>, greater<pair<long long,int>>> pq;
pq.push({0, s});
while (!pq.empty()) {
auto [d, u] = pq.top();
pq.pop();
// Jeśli znaleźliśmy lepszą ścieżkę wcześniej, pomijamy
if (d > dist[u]) continue;
for (auto &[v, w] : adj[u]) {
if (dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
return dist;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<vector<pair<int,int>>> adj(n);
// Wczytywanie grafu (u, v, w) – krawędź skierowana lub nieskierowana
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
// Jeśli graf nieskierowany, dodaj też:
// adj[v].push_back({u, w});
}
int start;
cin >> start;
vector<long long> dist = dijkstra(n, adj, start);
// Wypisanie wyników
for (int i = 0; i < n; i++) {
if (dist[i] == INF) cout << "INF\n";
else cout << dist[i] << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgSU5GID0gTExPTkdfTUFYOwoKLy8gRGlqa3N0cmE6IHpuYWpkxbogbmFqa3LDs3RzemUgb2RsZWfFgm/Fm2NpIG9kIHdpZXJ6Y2hvxYJrYSBzdGFydG93ZWdvICdzJwp2ZWN0b3I8bG9uZyBsb25nPiBkaWprc3RyYShpbnQgbiwgdmVjdG9yPHZlY3RvcjxwYWlyPGludCxpbnQ+Pj4gJmFkaiwgaW50IHMpIHsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGRpc3QobiwgSU5GKTsKICAgIGRpc3Rbc10gPSAwOwoKICAgIC8vIHByaW9yaXR5X3F1ZXVlOiAob2RsZWfFgm/Fm8SHLCB3aWVyemNob8WCZWspCiAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGxvbmcgbG9uZyxpbnQ+LCB2ZWN0b3I8cGFpcjxsb25nIGxvbmcsaW50Pj4sIGdyZWF0ZXI8cGFpcjxsb25nIGxvbmcsaW50Pj4+IHBxOwogICAgcHEucHVzaCh7MCwgc30pOwoKICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gW2QsIHVdID0gcHEudG9wKCk7CiAgICAgICAgcHEucG9wKCk7CgogICAgICAgIC8vIEplxZtsaSB6bmFsZcW6bGnFm215IGxlcHN6xIUgxZtjaWXFvGvEmSB3Y3plxZtuaWVqLCBwb21pamFteQogICAgICAgIGlmIChkID4gZGlzdFt1XSkgY29udGludWU7CgogICAgICAgIGZvciAoYXV0byAmW3YsIHddIDogYWRqW3VdKSB7CiAgICAgICAgICAgIGlmIChkaXN0W3VdICsgdyA8IGRpc3Rbdl0pIHsKICAgICAgICAgICAgICAgIGRpc3Rbdl0gPSBkaXN0W3VdICsgdzsKICAgICAgICAgICAgICAgIHBxLnB1c2goe2Rpc3Rbdl0sIHZ9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdDsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKCiAgICB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LGludD4+PiBhZGoobik7CgogICAgLy8gV2N6eXR5d2FuaWUgZ3JhZnUgKHUsIHYsIHcpIOKAkyBrcmF3xJlkxbogc2tpZXJvd2FuYSBsdWIgbmllc2tpZXJvd2FuYQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBpbnQgdSwgdiwgdzsKICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh7diwgd30pOwogICAgICAgIC8vIEplxZtsaSBncmFmIG5pZXNraWVyb3dhbnksIGRvZGFqIHRlxbw6CiAgICAgICAgLy8gYWRqW3ZdLnB1c2hfYmFjayh7dSwgd30pOwogICAgfQoKICAgIGludCBzdGFydDsKICAgIGNpbiA+PiBzdGFydDsKCiAgICB2ZWN0b3I8bG9uZyBsb25nPiBkaXN0ID0gZGlqa3N0cmEobiwgYWRqLCBzdGFydCk7CgogICAgLy8gV3lwaXNhbmllIHd5bmlrw7N3CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIGlmIChkaXN0W2ldID09IElORikgY291dCA8PCAiSU5GXG4iOwogICAgICAgIGVsc2UgY291dCA8PCBkaXN0W2ldIDw8ICJcbiI7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K