P1012
#include <bits/stdc++.h>
typedef long long i64;
typedef std::pair<i64, int> PLI;
const int N = 200010, M = 400010;
const i64 INF = 0x3f3f3f3f3f3f3f3f;
int n, m, s, uw;
int head[N], nxt[M << 1], to[M << 1], wt[M << 1], idx;
i64 dis[N];
bool rem[N];
std::priority_queue<PLI, std::vector<PLI >, std::greater<PLI > > q;
bool safe[N];
void add(int u, int v, int w) {
nxt[idx] = head[u];
to[idx] = v;
wt[idx] = w;
head[u] = idx;
++ idx;
return;
}
void dijkstra(void) {
for (int i = 1; i <= n; ++ i) {
dis[i] = INF;
rem[i] = false;
}
dis[s] = 0;
q.push(std::make_pair(dis[s], s));
while (!q.empty()) {
int t = q.top().second;
q.pop();
if (rem[t]) {
continue;
}
for (int i = head[t]; i != -1; i = nxt[i]) {
int e = to[i], w = wt[i];
if (!rem[e] && dis[e] > dis[t] + w) {
dis[e] = dis[t] + w;
q.push(std::make_pair(dis[e], e));
}
}
}
return;
}
i64 myABS(i64 x) {
return (x >= 0) ? x : (-x);
}
int main(void) {
memset(head, -1, sizeof(head));
int inpu, inpv, inpw;
scanf("%d%d%d%d", &n, &m, &s, &uw);
for (int i = 1; i <= m; ++ i) {
scanf("%d%d%d", &inpu, &inpv, &inpw);
add(inpu, inpv, inpw);
add(inpv, inpu, inpw);
}
dijkstra();
for (int i = 1; i <= n; ++ i) {
safe[i] = false;
int cnt = 0;
for (int j = head[i]; j != -1; j = nxt[j]) {
int p = to[j], w = wt[j];
if (dis[p] + w == dis[i]) {
++ cnt;
}
}
if (cnt > 1) {
safe[i] = true;
}
}
i64 ans = 0;
for (int i = 1; i <= n; ++ i) {
for (int j = head[i]; j != -1; j = nxt[j]) {
int e = to[j], w = wt[j];
if (e <= i) {
continue;
}
i64 del;
if (dis[i] + w == dis[e]) {
del = (safe[e] ? (w - 1) : (uw - 1));
} else if (dis[e] + w == dis[i]) {
del = (safe[i] ? (w - 1) : (uw - 1));
} else {
del = std::max(0ll, myABS(dis[i] - dis[e]) - 1);
// 此处实际应为 std::min(myABS(dis[i] - dis[e]) - 1, uw).
// 但取 uw 不可能.
}
ans += del;
}
}
printf("%lld\n", ans);
return 0;
}