#include #define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i)) #define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i)) #define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i)) #define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i)) #define ALL(x) begin(x), end(x) #define dump(x) cerr << #x " = " << x << endl using ll = long long; using namespace std; template using reversed_priority_queue = priority_queue, greater >; template inline void chmax(T & a, U const & b) { a = max(a, b); } template inline void chmin(T & a, U const & b) { a = min(a, b); } template auto make_vectors(X x, T a) { return vector(x, a); } template auto make_vectors(X x, Y y, Z z, Zs... zs) { auto cont = make_vectors(y, z, zs...); return vector(x, cont); } template ostream & operator << (ostream & out, vector const & xs) { REP (i, (int)xs.size() - 1) out << xs[i] << ' '; if (not xs.empty()) out << xs.back(); return out; } vector dijkstra(vector > > const & g, int root) { vector dist(g.size(), LLONG_MAX); priority_queue > que; dist[root] = 0; que.emplace(- dist[root], root); while (not que.empty()) { ll dist_i; int i; tie(dist_i, i) = que.top(); que.pop(); if (dist[i] < - dist_i) continue; for (auto it : g[i]) { int j; ll cost; tie(j, cost) = it; if (- dist_i + cost < dist[j]) { dist[j] = - dist_i + cost; que.emplace(dist_i - cost, j); } } } return dist; } ll solve(int n, int m, int p, int q, ll t, const vector > > & g) { auto dist_0 = dijkstra(g, 0); auto dist_p = dijkstra(g, p); auto dist_q = dijkstra(g, q); ll ans = -1; if (dist_0[p] + dist_p[q] + dist_0[q] <= t) { ans = t; } REP (x, n) REP (y, n) { ll total = dist_0[x] + max(dist_p[x] + dist_p[y], dist_q[x] + dist_q[y]) + dist_0[y]; if (total <= t) { chmax(ans, dist_0[x] + dist_0[y] + (t - total)); } } return ans; } int main() { int n, m, p, q; ll t; cin >> n >> m >> p >> q >> t; -- p; -- q; vector > > g(n); REP (i, m) { int a, b; ll c; cin >> a >> b >> c; -- a; -- b; g[a].emplace_back(b, c); g[b].emplace_back(a, c); } cout << solve(n, m, p, q, t, g) << endl; return 0; }