#include #include using namespace std; typedef long long ll; const ll INF = 1000000000000; template struct Edge { int to; T cost; }; template struct WeightedGraph { int n; std::vector>> g; WeightedGraph(){} WeightedGraph(int n) : n(n){ g.resize(n); } void add_edge(int from, int to, T cost){ g[from].push_back((Edge){to, cost}); } }; template std::vector dijkstra(WeightedGraph &g, int s){ int n = g.n; std::vector d(n); fill(d.begin(), d.end(), -1); std::priority_queue, std::vector>, std::greater>> que; d[s] = 0; que.push(std::pair(0, s)); while(que.size()){ std::pair p = que.top(); que.pop(); int u = p.second; if(d[u] < p.first) continue; for(Edge &e : g.g[u]){ int v = e.to; if(d[v] == -1 || d[v] > d[u] + e.cost){ d[v] = d[u] + e.cost; que.push(std::pair(d[v], v)); } } } return d; } ll dp[4100][15][2]; int main() { int n, m, k; cin >> n >> m >> k; int r[15]; for(int i = 0; i < k; i++){ cin >> r[i]; r[i]--; } WeightedGraph g0(n); int a[20005], b[20005]; ll c[20005]; for(int i = 0; i < m; i++){ cin >> a[i] >> b[i] >> c[i]; a[i]--; b[i]--; g0.add_edge(a[i], b[i], c[i]); g0.add_edge(b[i], a[i], c[i]); } vector v[15][2]; for(int i = 0; i < k; i++){ v[i][0] = dijkstra(g0, a[r[i]]); v[i][1] = dijkstra(g0, b[r[i]]); } v[k][0] = dijkstra(g0, 0); for(int i = 0; i < (1 << k); i++){ for(int j = 0; j < k; j++) dp[i][j][0] = dp[i][j][1] = INF; } for(int i = 0; i < k; i++){ dp[1 << i][i][0] = v[k][0][b[r[i]]] + c[r[i]]; dp[1 << i][i][1] = v[k][0][a[r[i]]] + c[r[i]]; } for(int s = 1; s < (1 << k); s++){ for(int i = 0; i < k; i++){ if(!((s >> i) & 1)) continue; for(int j = 0; j < k; j++){ int t = s ^ (1 << i); if(!((t >> j) & 1)) continue; for(int l = 0; l < 2; l++){ dp[s][i][0] = min(dp[s][i][0], dp[t][j][l] + v[j][l][b[r[i]]] + c[r[i]]); dp[s][i][1] = min(dp[s][i][1], dp[t][j][l] + v[j][l][a[r[i]]] + c[r[i]]); } } } } ll ans = INF; for(int i = 0; i < k; i++){ ans = min(ans, dp[(1 << k) - 1][i][0] + v[i][0][n - 1]); ans = min(ans, dp[(1 << k) - 1][i][1] + v[i][1][n - 1]); } cout << ans << endl; }