#include //#include using ll = long long; #define MOD 1000000007 #define Mod 998244353 const int MAX = 1000000005; const long long INF = 1000000000000000005LL; using namespace std; //using namespace atcoder; #define MOD 1000000007 using i_i = pair; using ll_i = pair; int main() { ios::sync_with_stdio(0); cin.tie(); int N, M, L, S, E; cin >> N >> M >> L >> S >> E; vector> G(N); for (int i = 0; i < M; i++) { int a, b, t; cin >> a >> b >> t; a--; b--; G[a].push_back({b, t}); G[b].push_back({a, t}); } vector T(L); for (int i = 0; i < L; i++) {cin >> T[i]; T[i]--;} priority_queue, greater> pq; vector dist(N, INF); pq.push({0, 0}); dist[0] = 0; while (pq.size()) { auto [d, v] = pq.top(); pq.pop(); if (d != dist[v]) continue; for (auto [nv, c] : G[v]) { if (dist[nv] <= d + c) continue; dist[nv] = d + c; pq.push({d + c, nv}); } } vector dist2(N, INF); dist2[N-1] = 0; pq.push({0, N-1}); while (pq.size()) { auto [d, v] = pq.top(); pq.pop(); if (d != dist2[v]) continue; for (auto [nv, c] : G[v]) { if (dist2[nv] <= d + c) continue; dist2[nv] = d + c; pq.push({d + c, nv}); } } ll ans = INF; for (int i = 0; i < L; i++) { ll d = dist[T[i]]; if (d >= S + E) continue; ans = min(ans, max((ll)S, d) + 1 + dist2[T[i]]); } cout << (ans == INF ? -1 : ans) << endl; }