#include #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; using ll = long long; const ll mod = 998244353; #define fi first #define se second #define rep(i,n) for(ll i=0;i; struct Edge{ ll to; ll cost; }; using Graph = vector>; const ll INF = 1LL<<60; void dijkstra(const Graph &G,ll s,vector &dis){ ll N=G.size(); dis.assign(N,INF); priority_queue,greater

> pq; dis[s]=0; pq.emplace(dis[s],s); while(!pq.empty()){ P p=pq.top(); pq.pop(); ll v=p.se; if(p.fi>dis[v]) continue; for(auto &e:G[v]){ if(dis[e.to]>dis[v]+e.cost){ dis[e.to]=dis[v]+e.cost; pq.emplace(dis[e.to],e.to); } } } } int main() { ll N,M,L,S,E; cin >> N >> M >> L >> S >> E; ll ans=INF; Graph G(N); rep(i,M){ ll a,b,t; cin >> a >> b >> t; G[a-1].push_back({b-1,t}); G[b-1].push_back({a-1,t}); } vector dis1,dis2; dijkstra(G,0,dis1); dijkstra(G,N-1,dis2); rep(i,L){ ll t; cin >> t; t--; if(dis1[t]<=S+E-1){ ans=min(ans,max(S,dis1[t])+1+dis2[t]); } } if(ans==INF){ cout << -1 << endl; }else{ cout << ans << endl; } return 0; }