#include using namespace std; #define ld long double #define ll long long #define ALL(a) (a).begin(),(a).end() #define ALLR(a) (a).rbegin(),(a).rend() #define spa << " " << #define MP make_pair #define test cout<<"test"<; void chmin(ll &a,ll b){if(a>b)a=b;} void chmax(ll &a,ll b){if(ausing P = pair; vector> G(MAX_V); //隣接リスト vector d(MAX_V); //各頂点への最短距離 void dijkstra(ll s) { priority_queue, greater

> que; fill(ALL(d), INF); d[s] = 0; que.push(P(0, s)); while (!que.empty()) { P p = que.top(); que.pop(); ll v = p.second; if (d[v] < p.first) continue; for (ll i=0; i d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(P(d[e.to], e.to)); } } } } int main(){ ll i,j,o; ll res=-1,res1=INF,res2=-INF,buf=0,buf1=0,buf2=0,buf3=0,buf4=0,sum=0; bool judge = true; ll n,m,p,q,t;cin>>n>>m>>p>>q>>t; vector u(m),v(m),a(m); for(i=0;i>u[i]>>v[i]>>a[i]; struct edge e ={v[i],a[i]}; G[u[i]].push_back(e); e ={u[i],a[i]}; G[v[i]].push_back(e); } vectordp(n+1),dq(n+1); dijkstra(p); for(i=1;i<=n;i++)dp[i]=d[i]; dijkstra(q); for(i=1;i<=n;i++)dq[i]=d[i]; if(dp[1]>dq[1]){ queue r; r.push(1); while(!r.empty()){ buf=r.front(); chmax(res,t-max(2*dp[1], dp[1]-dp[buf]+dq[buf]+dq[1])+dp[1]-dp[buf]); if(dq[buf]<=dp[buf]) chmax(res,t-2*dq[1]+2*(dp[1]-dp[buf])); for(i=0;i r; r.push(1); while(!r.empty()){ buf=r.front(); //cout<