#include using namespace std; #define int long long vector > graph[2010]; int n, m, p, q, t; int dist[2010][2010]; void min_dist(int st){ for(int i = 0;i < n;i++){ dist[st][i] = LLONG_MAX/4; } dist[st][st] = 0; priority_queue, vector >, greater > > que; que.push(make_pair(0, st)); while(!que.empty()){ int cost = que.top().first; int idx = que.top().second; que.pop(); for(int i = 0;i < graph[idx].size();i++){ int next = graph[idx][i].first; int ncost = graph[idx][i].second + cost; if(dist[st][next] > ncost){ dist[st][next] = ncost; que.push(make_pair(ncost, next)); } } } return; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> p >> q >> t; p--; q--; int a, b, c; for(int i = 0;i < m;i++){ cin >> a >> b >> c; a--; b--; graph[a].push_back(make_pair(b, c)); graph[b].push_back(make_pair(a, c)); } min_dist(0); min_dist(p); min_dist(q); if(dist[0][p] + dist[p][q] + dist[q][0] <= t){ cout << t << endl; return 0; } int ans = -1; for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ int ma = max(dist[q][i]+dist[q][j], dist[p][i]+dist[p][j]); if(dist[0][i]+dist[0][j] + ma <= t){ ans = max(ans, t-ma); } } } cout << ans << endl; return 0; }