#include #include #include #include #include using namespace std; const int MAXN = 10000; struct State { int to, price; State( int t, int p ) : to(t), price(p) {} bool operator<( const State& s ) const { if( price == s.price ) return to < s.to; return price > s.price; } }; int N, M, H; int h[100]; bool mark_h[MAXN]; vector v[MAXN]; void input() { scanf("%d %d %d", &N, &M, &H); for( int i = 0; i < H; i++ ) { scanf("%d", &h[i]); mark_h[h[i]-1] = 1; } int first, second, price; for( int i = 0; i < M; i++ ) { scanf("%d %d %d", &first, &second, &price); v[first-1].push_back(State(second-1, price)); v[second-1].push_back(State(first-1, price)); } } int dist[MAXN]; void dijkstra( int start ) { bool used[MAXN]; memset(used, 0, sizeof(used)); memset(dist, 63, sizeof(dist)); dist[start] = 0; priority_queue pq; pq.push(State(start, 0)); while( !pq.empty() ) { int vertex = pq.top().to; pq.pop(); if( used[vertex] ) { continue; } used[vertex] = 1; for( int i = 0; i < v[vertex].size(); i++ ) { int to = v[vertex][i].to; int price = v[vertex][i].price; if( !used[to] && dist[to] > dist[vertex] + price ) { dist[to] = dist[vertex] + price; pq.push(State(to, dist[to])); } } } } int main() { input(); int min_sum = 1e9; for( int i = 0; i < H; i++ ) { dijkstra(h[i]-1); int sum = 0; for( int j = 0; j < N; j++ ) { if( !mark_h[j] ) sum += dist[j]; } if( sum < min_sum ) min_sum = sum; } printf("%d\n", min_sum); return 0; } /** **/