#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define Inf 987654321
int V, E, start;
int dt[20001], visit[20001];
vector<pair<int, int> > v[20001];
void func() {
queue<int> q;
q.push(start);
while (1) {
int size = q.size();
if (size == 0)
break;
int sv = q.front();
q.pop();
for (int i = 0; i < v[sv].size(); i++) {
if(visit[v[sv][i].first] == 0){
visit[v[sv][i].first] = 1;
if (dt[v[sv][i].first] > v[sv][i].second + dt[sv]) {
dt[v[sv][i].first] = v[sv][i].second + dt[sv];
}
q.push(v[sv][i].first);
}
//한 점에서 두번째 방문시 길이 체크
else if (visit[v[sv][i].first] == 1) {
if (dt[v[sv][i].first] > v[sv][i].second + dt[sv]) {
dt[v[sv][i].first] = v[sv][i].second + dt[sv];
}
}
}
}
}
int main() {
scanf("%d %d", &V, &E);
scanf("%d", &start);
for (int i = 0; i < E; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
v[a].push_back(pair<int, int>(b, c));
}
for (int i = 1; i <= V; i++)
dt[i] = Inf;
dt[start] = 0;
//func
func();
for (int i = 1; i <= V; i++){
if (dt[i] == Inf)
printf("INF\n");
else
printf("%d\n", dt[i]);
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIEluZiA5ODc2NTQzMjEKaW50IFYsIEUsIHN0YXJ0OwppbnQgZHRbMjAwMDFdLCB2aXNpdFsyMDAwMV07CnZlY3RvcjxwYWlyPGludCwgaW50PiA+IHZbMjAwMDFdOwoKdm9pZCBmdW5jKCkgewoJcXVldWU8aW50PiBxOwoJcS5wdXNoKHN0YXJ0KTsKCgl3aGlsZSAoMSkgewoJCWludCBzaXplID0gcS5zaXplKCk7CgoJCWlmIChzaXplID09IDApCgkJCWJyZWFrOwoKCQlpbnQgc3YgPSBxLmZyb250KCk7CgkJcS5wb3AoKTsKCgkJZm9yIChpbnQgaSA9IDA7IGkgPCB2W3N2XS5zaXplKCk7IGkrKykgewoJCQlpZih2aXNpdFt2W3N2XVtpXS5maXJzdF0gPT0gMCl7CgkJCQl2aXNpdFt2W3N2XVtpXS5maXJzdF0gPSAxOwoJCQkJaWYgKGR0W3Zbc3ZdW2ldLmZpcnN0XSA+IHZbc3ZdW2ldLnNlY29uZCArIGR0W3N2XSkgewoJCQkJCWR0W3Zbc3ZdW2ldLmZpcnN0XSA9IHZbc3ZdW2ldLnNlY29uZCArIGR0W3N2XTsKCQkJCX0KCQkJCXEucHVzaCh2W3N2XVtpXS5maXJzdCk7CgkJCX0KCQkJLy/tlZwg7KCQ7JeQ7IScIOuRkOuyiOynuCDrsKnrrLjsi5wg6ri47J20IOyytO2BrAoJCQllbHNlIGlmICh2aXNpdFt2W3N2XVtpXS5maXJzdF0gPT0gMSkgewoJCQkJaWYgKGR0W3Zbc3ZdW2ldLmZpcnN0XSA+IHZbc3ZdW2ldLnNlY29uZCArIGR0W3N2XSkgewoJCQkJCWR0W3Zbc3ZdW2ldLmZpcnN0XSA9IHZbc3ZdW2ldLnNlY29uZCArIGR0W3N2XTsKCQkJCX0KCQkJfQoKCQl9CgoJfQoKfQoKaW50IG1haW4oKSB7CglzY2FuZigiJWQgJWQiLCAmViwgJkUpOwoJc2NhbmYoIiVkIiwgJnN0YXJ0KTsKCglmb3IgKGludCBpID0gMDsgaSA8IEU7IGkrKykgewoJCWludCBhLCBiLCBjOwoJCXNjYW5mKCIlZCAlZCAlZCIsICZhLCAmYiwgJmMpOwoJCXZbYV0ucHVzaF9iYWNrKHBhaXI8aW50LCBpbnQ+KGIsIGMpKTsKCgl9CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gVjsgaSsrKQoJCWR0W2ldID0gSW5mOwoJZHRbc3RhcnRdID0gMDsKCS8vZnVuYwoJZnVuYygpOwoKCWZvciAoaW50IGkgPSAxOyBpIDw9IFY7IGkrKyl7CgkJaWYgKGR0W2ldID09IEluZikKCQkJcHJpbnRmKCJJTkZcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCIlZFxuIiwgZHRbaV0pOwoJfQoKCglyZXR1cm4gMDsKfQ==