#include <iostream>
using namespace std;
const int oo = 1000000;
int n, m; //n为点的个数 m为边的条数
int begin, end; //begin为起始点 end为结束点
struct bian {
int a, b;
int w;
} * E;
int *D;
int Ford() {
int i, j;
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) { //松弛
if (D[E[i].b] > D[E[i].a] + E[i].w) {
D[E[i].b] = D[E[i].a] + E[i].w;
}
}
}
return 0;
}
int main() {
int i, j;
int a, b, w;
cin >> n >> m >> begin >> end;
D = new int[n + 1];
E = new bian[m + 1];
for (i = 1; i <= m; i++) {
cin >> a >> b >> w;
E[i].a = a;
E[i].b = b;
E[i].w = w;
}
memset(D, oo, sizeof(int) * (n + 1));
D[begin] = 0;
Ford();
for (i = 1; i <= n; i++) {
cout << D[i] << ' ';
}
return 0;
}