#include #include #include #include #include #include #include #include using namespace std; #define int long long #define rep(i,n) for(int i = 0; i < (n); i++) #define endl "\n" const long long INF = (long long)1e16; const long long MOD = (long long)1e9 + 7; string yn(bool f){return f?"Yes":"No";} string YN(bool f){return f?"YES":"NO";} int N, M, P, Q, T; void dijkstra(vector &dis, vector>> G, int s){ priority_queue, vector>, greater>> Q; dis.resize(N, INF); dis[s] = 0; Q.push(make_pair(0,s)); while(!Q.empty()){ pair p = Q.top(); Q.pop(); int n = p.second; if(dis[n] < p.first) continue; for(pair y : G[n]){ if(dis[n] + y.second < dis[y.first]){ dis[y.first] = dis[n] + y.second; Q.push(make_pair(dis[y.first], y.first)); } } } } signed main(){ cin.tie(0); ios::sync_with_stdio(false); cout<>> G; vector dis, disp, disq; int ans = -1; int a, b, c; cin>>N>>M>>P>>Q>>T; P--, Q--; G.resize(N); for(int i = 0; i < M; i++){ cin>>a>>b>>c; a--,b--; assert(a < N); assert(b < N); G[a].push_back(make_pair(b,c)); G[b].push_back(make_pair(a,c)); } dijkstra(dis, G, 0); dijkstra(disp, G, P); dijkstra(disq, G, Q); if(dis[P] + disp[Q] + disq[0] <= T) ans = T; if(dis[Q] + disq[P] + disp[0] <= T) ans = T; for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ if(dis[i] + max(disp[i] + disp[j], disq[i] + disq[j]) + dis[j] > T) continue; ans = max(ans, T - max(disp[i] + disp[j], disq[i] + disq[j])); } } cout<