#include #include #include #include using namespace std; const long long inf = 1LL << 61; struct edge { int to; long long cost; }; struct state { int pos; long long cost; }; bool operator<(const state& s1, const state& s2) { return s1.cost > s2.cost; } vector dijkstra(vector >& G, int src) { vector dist(G.size(), inf); dist[src] = 0; priority_queue que; que.push(state{ src, 0 }); while (!que.empty()) { int u = que.top().pos; que.pop(); for (edge e : G[u]) { if (dist[e.to] > dist[u] + e.cost) { dist[e.to] = dist[u] + e.cost; que.push(state{ e.to, dist[e.to] }); } } } return dist; } int main() { int N, M, P, Q; long long T; cin >> N >> M >> P >> Q >> T; --P, --Q; vector > G(N); for (int i = 0; i < M; ++i) { int a, b; long long c; cin >> a >> b >> c; --a, --b; G[a].push_back(edge{ b, c }); G[b].push_back(edge{ a, c }); } vector s0 = dijkstra(G, 0); vector sp = dijkstra(G, P); vector sq = dijkstra(G, Q); if (max(sp[0] * 2, sq[0] * 2) > T) { cout << -1 << endl; } else if (s0[P] + sp[Q] + sq[0] <= T) { cout << T << endl; } else { long long ans = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { long long sum = s0[i] + max(sp[i] + sp[j], sq[i] + sq[j]) + s0[j]; if (sum <= T) { ans = max(ans, T - max(sp[i] + sp[j], sq[i] + sq[j])); } } } cout << ans << endl; } return 0; }