#include using namespace std; struct edge{ int to; int cost; int i; }; typedef tuple P; int main(){ int N, M, K; cin >> N >> M >> K; vector R(K); for(int i = 0; i < K; i++) { cin >> R[i]; R[i]--; } vector> G(N); vector t(M, -1); for(int i = 0; i < K; i++) t[R[i]] = i; for(int i = 0; i < M; i++){ int A, B, C; cin >> A >> B >> C; A--; B--; G[A].push_back({B, C, i}); G[B].push_back({A, C, i}); } int INF = 1000000000; vector> d(N, vector(1 << K, INF)); d[0][0] = 0; priority_queue, greater

> q; q.push({0, 0, 0}); while(!q.empty()){ auto [dis, now, bit] = q.top(); q.pop(); if(d[now][bit] > dis) continue; for(auto [to, cost, i] : G[now]){ int b = bit; if(t[i] != -1) b |= (1 << t[i]); if(d[to][b] > dis + cost){ d[to][b] = dis + cost; q.push({d[to][b], to, b}); } } } cout << d[N - 1][(1 << K) - 1] << endl; }