#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 using namespace std; template class EdgeBase { public: int to; T cost; EdgeBase(){}; EdgeBase(int to0, T cost0){to = to0; cost = cost0;} }; typedef EdgeBase Edge; template void shortestPath(const vector > >& edges, int start, vector& dist) { const T INF = numeric_limits::max(); const T EPS = static_cast(1.0e-10); dist.assign(edges.size(), INF); dist[start] = 0; priority_queue, vector >, greater > > q; q.push(make_pair(0, start)); while(!q.empty()){ pair p = q.top(); q.pop(); int v = p.second; if(dist[v] < p.first - EPS) continue; for(unsigned i=0; i e = edges[v][i]; if(dist[v] + e.cost < dist[e.to] - EPS){ dist[e.to] = dist[v] + e.cost; q.push(make_pair(dist[e.to], e.to)); } } } } int main() { int n, m, p, q, t; cin >> n >> m >> p >> q >> t; -- p; -- q; vector > edges(n); for(int i=0; i> a >> b >> c; -- a; -- b; edges[a].push_back(Edge(b, c)); edges[b].push_back(Edge(a, c)); } vector dist, dist_p, dist_q; shortestPath(edges, 0, dist); shortestPath(edges, p, dist_p); shortestPath(edges, q, dist_q); long long ans = -1; if(dist[p] + dist[q] + dist_p[q] <= t){ ans = t; } else{ for(int i=0; i t) continue; ans = max(ans, t - max(y, z)); } } cout << ans << endl; return 0; }