#include #include #include using namespace std; typedef long long LL; typedef pair PLI; const int N = 2010, M = 200010; bool st[N]; LL d[3][N]; priority_queue, greater> pq; int n, m, p, q, t, h[N], e[M], ne[M], w[M], idx; void Add(int x, int y, int z) { e[idx] = y, w[idx] = z, ne[idx] = h[x], h[x] = idx++; } void Dijkstra(int S, LL dd[]) { memset(st, 0, sizeof(st)); pq.push({ 0LL, S }), dd[S] = 0LL; while (!pq.empty()) { auto [dist, u] = pq.top(); pq.pop(); if (st[u]) continue; st[u] = true; for (int i = h[u]; i != -1; i = ne[i]) { int v = e[i]; if (dd[v] > dist + w[i]) { dd[v] = dist + w[i]; pq.push({ dd[v], v }); } } } } int main() { // freopen("friend.in", "r", stdin); // freopen("friend.out", "w", stdout); scanf("%d%d%d%d%d", &n, &m, &p, &q, &t); memset(h, -1, sizeof(h)); for (int i = 1, a, b, c; i <= m; ++i) { scanf("%d%d%d", &a, &b, &c); Add(a, b, c), Add(b, a, c); } memset(d, 0x3f, sizeof(d)); Dijkstra(1, d[0]), Dijkstra(p, d[1]), Dijkstra(q, d[2]); if (d[0][p] + d[0][q] + d[1][q] <= t) printf("%d\n", t); else { LL ans = -1; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { LL ti = d[0][i] + max(d[1][i] + d[1][j], d[2][i] + d[2][j]) + d[0][j]; if (ti <= t) ans = max(ans, d[0][i] + d[0][j] + t - ti); } } printf("%lld\n", ans); } return 0; }