#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include using namespace std; using Int = long long; //using namespace boost::multiprecision; const double EPS = 1e-10; long long const MOD = 1000000007; long long mod_pow(long long x, long long n) { long long res = 1; for (int i = 0;i < 60; i++) { if (n >> i & 1) res = res * x % MOD; x = x * x % MOD; } return res; } template T gcd(T a, T b) { return b != 0 ? gcd(b, a % b) : a; } template T lcm(T a, T b) { return a * b / gcd(a, b); } void fastInput() { cin.tie(0); ios::sync_with_stdio(false); } struct Edge{ int from, to, cost; bool operator <(const Edge &e) const { return cost < e.cost; } bool operator >(const Edge &e) const { return cost > e.cost; } bool operator ==(const Edge &e) const { return cost == e.cost; } bool operator !=(const Edge &e) const { return cost != e.cost; } }; template vector dijkstra(vector> &G, int s) { int V = G.size(); vector d(V); fill(d.begin(), d.end(), numeric_limits::max()); priority_queue , vector>, greater>> que; d[s] = 0; que.push(make_pair(0,s)); while (!que.empty()) { pair p = que.top(); que.pop(); int v = p.second; if (d[v] < p.first) continue; for (int i=0; i d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(make_pair(d[e.to], e.to)); } } } return d; } vector> G; vector DistFromStart; vector DistFromP; vector DistFromQ; Int T; int main(void) { Int N, M, P, Q; cin >> N >> M >> P >> Q >> T; P--, Q--; G = vector>(N); for (int i = 0; i < M; i++) { int a, b, c; cin >> a >> b >> c; a--, b--, c; G[a].push_back({a, b, c}); G[b].push_back({b, a, c}); } DistFromStart = dijkstra(G, 0); DistFromP = dijkstra(G, P); DistFromQ = dijkstra(G, Q); Int ans = -1; for (int i = 0; i < G.size(); i++) { for (int j = 0; j < G.size(); j++) { Int sum = 0; sum += DistFromStart[i]; sum += max(DistFromP[i]+DistFromP[j], DistFromQ[i]+DistFromQ[j]); sum += DistFromStart[j]; if (sum <= T) { ans = max(DistFromStart[i]+DistFromStart[j]+T-sum, ans); } } } if (DistFromStart[P] + DistFromP[Q] + DistFromQ[0] <= T) { Int tmp = DistFromStart[P] + DistFromP[Q] + DistFromP[0]; ans = max(DistFromStart[P] + DistFromP[Q] + DistFromP[0] + T - tmp, ans); } if (DistFromStart[Q] + DistFromQ[P] + DistFromP[0] <= T) { Int tmp = DistFromStart[Q] + DistFromQ[P] + DistFromP[0]; ans = max(DistFromStart[Q] + DistFromQ[P] + DistFromP[0] + T - tmp, ans); } cout << ans << endl; return 0; }