#include #include #include #include using namespace std; using i64 = long long; using u64 = unsigned long long; using i32 = int; using u32 = unsigned int; #define rep(i,n) for(int i=0; i<(n); i++) template using nega_queue = priority_queue,greater>; struct Edge{ int u,v,c; }; struct AdjEdge{ int to; i64 d; }; int N,M; vector J; vector> E; int K; vector R; vector dist(int s){ nega_queue> Q; vector D(E.size(), 1001001001001001001); Q.push({ 0,s }); D[s] = 0; while(Q.size()){ auto [d,p] = Q.top(); Q.pop(); if(D[p] != d) continue; for(auto [to,dd] : E[p]){ if(D[to] <= d+dd) continue; D[to] = d+dd; Q.push({ D[to],to }); } } return D; } int main() { cin >> N >> M >> K; E.resize(N); J.resize(M); R.resize(K); rep(i,K){ cin >> R[i]; R[i]--; } rep(i,M){ int u,v,c; cin >> u >> v >> c; u--; v--; J[i] = {u,v,c}; E[u].push_back({v,c}); E[v].push_back({u,c}); } vector Rp(K*2); rep(i,K) Rp[i*2] = J[R[i]].u; rep(i,K) Rp[i*2+1] = J[R[i]].v; vector> G2(K*2 * (1<