#include <bits/stdc++.h>
#define ll long long
#define el '\n'
#define oo LLONG_MAX >> 2
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()
#define pb push_back
#define pep_Guardiola \
ios::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0);
using namespace std;
struct Node {
int u;
ll cost;
int mn, mx;
Node() = default;
Node(int u, ll cost, int mn, int mx) : u(u), cost(cost), mn(mn), mx(mx) {}
bool operator<(const Node &other) const { return cost > other.cost; }
};
signed main() {
pep_Guardiola int n, m, s, x;
cin >> n >> m >> s >> x;
s--;
vector<vector<pair<int, int>>> adj(n);
for (int i = 0, u, v, w; i < m; i++)
cin >> u >> v >> w, u--, v--, adj[u].push_back({v, w}),
adj[v].push_back({u, w});
ll dist[n][2][2];
for (int i = 0; i < n; i++)
for (int j = 0; j < 2; j++)
for (int z = 0; z < 2; z++)
dist[i][j][z] = oo;
dist[s][0][0] = 0;
priority_queue<Node> pq;
pq.push({s, 0, 0, 0});
while (pq.size()) {
auto [u, cost, mn, mx] = pq.top();
pq.pop();
if (dist[u][mn][mx] < cost)
continue;
for (auto &[v, w] : adj[u]) {
if (dist[v][mn][mx] > cost + w + x)
pq.push({v, dist[v][mn][mx] = cost + w + x, mn, mx});
if (!mn && dist[v][1][mx] > cost + 2 * w + x)
pq.push({v, dist[v][1][mx] = cost + 2 * w + x, 1, mx});
if (!mx && dist[v][mn][1] > cost + x)
pq.push({v, dist[v][mn][1] = cost + x, mn, 1});
if (!mx && !mn && dist[v][1][1] > cost + x + w)
pq.push({v, dist[v][1][1] = cost + w + x, 1, 1});
}
}
for (int i = 0; i < n; i++)
if (i != s)
cout << dist[i][1][1] << ' ';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZWwgJ1xuJwojZGVmaW5lIG9vIExMT05HX01BWCA+PiAyCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIGFsbHIoeCkgeC5yYmVnaW4oKSwgeC5yZW5kKCkKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBwZXBfR3VhcmRpb2xhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBjaW4udGllKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICBjb3V0LnRpZSgwKTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RydWN0IE5vZGUgewogIGludCB1OwogIGxsIGNvc3Q7CiAgaW50IG1uLCBteDsKICBOb2RlKCkgPSBkZWZhdWx0OwogIE5vZGUoaW50IHUsIGxsIGNvc3QsIGludCBtbiwgaW50IG14KSA6IHUodSksIGNvc3QoY29zdCksIG1uKG1uKSwgbXgobXgpIHt9CiAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTm9kZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuIGNvc3QgPiBvdGhlci5jb3N0OyB9Cn07CnNpZ25lZCBtYWluKCkgewogIHBlcF9HdWFyZGlvbGEgaW50IG4sIG0sIHMsIHg7CiAgY2luID4+IG4gPj4gbSA+PiBzID4+IHg7CiAgcy0tOwogIHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsIGludD4+PiBhZGoobik7CiAgZm9yIChpbnQgaSA9IDAsIHUsIHYsIHc7IGkgPCBtOyBpKyspCiAgICBjaW4gPj4gdSA+PiB2ID4+IHcsIHUtLSwgdi0tLCBhZGpbdV0ucHVzaF9iYWNrKHt2LCB3fSksCiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh7dSwgd30pOwogIGxsIGRpc3Rbbl1bMl1bMl07CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICBmb3IgKGludCBqID0gMDsgaiA8IDI7IGorKykKICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCAyOyB6KyspCiAgICAgICAgZGlzdFtpXVtqXVt6XSA9IG9vOwogIGRpc3Rbc11bMF1bMF0gPSAwOwogIHByaW9yaXR5X3F1ZXVlPE5vZGU+IHBxOwogIHBxLnB1c2goe3MsIDAsIDAsIDB9KTsKICB3aGlsZSAocHEuc2l6ZSgpKSB7CiAgICBhdXRvIFt1LCBjb3N0LCBtbiwgbXhdID0gcHEudG9wKCk7CiAgICBwcS5wb3AoKTsKICAgIGlmIChkaXN0W3VdW21uXVtteF0gPCBjb3N0KQogICAgICBjb250aW51ZTsKICAgIGZvciAoYXV0byAmW3YsIHddIDogYWRqW3VdKSB7CiAgICAgIGlmIChkaXN0W3ZdW21uXVtteF0gPiBjb3N0ICsgdyArIHgpCiAgICAgICAgcHEucHVzaCh7diwgZGlzdFt2XVttbl1bbXhdID0gY29zdCArIHcgKyB4LCBtbiwgbXh9KTsKICAgICAgaWYgKCFtbiAmJiBkaXN0W3ZdWzFdW214XSA+IGNvc3QgKyAyICogdyArIHgpCiAgICAgICAgcHEucHVzaCh7diwgZGlzdFt2XVsxXVtteF0gPSBjb3N0ICsgMiAqIHcgKyB4LCAxLCBteH0pOwogICAgICBpZiAoIW14ICYmIGRpc3Rbdl1bbW5dWzFdID4gY29zdCArIHgpCiAgICAgICAgcHEucHVzaCh7diwgZGlzdFt2XVttbl1bMV0gPSBjb3N0ICsgeCwgbW4sIDF9KTsKICAgICAgaWYgKCFteCAmJiAhbW4gJiYgZGlzdFt2XVsxXVsxXSA+IGNvc3QgKyB4ICsgdykKICAgICAgICBwcS5wdXNoKHt2LCBkaXN0W3ZdWzFdWzFdID0gY29zdCArIHcgKyB4LCAxLCAxfSk7CiAgICB9CiAgfQogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgaWYgKGkgIT0gcykKICAgICAgY291dCA8PCBkaXN0W2ldWzFdWzFdIDw8ICcgJzsKfQ==