#include using namespace std; #define REP(i,a,b) for(i=a;i'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);} void reader(ll *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);} int reader(char c[]){int i,s=0;for(;;){mygc(i);if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF) break;}c[s++]=i;for(;;){mygc(i);if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF) break;c[s++]=i;}c[s]='\0';return s;} template void reader(T *x, S *y){reader(x);reader(y);} template void reader(T *x, S *y, U *z){reader(x);reader(y);reader(z);} template void reader(T *x, S *y, U *z, V *w){reader(x);reader(y);reader(z);reader(w);} void writer(int x, char c){int s=0,m=0;char f[10];if(x<0)m=1,x=-x;while(x)f[s++]=x%10,x/=10;if(!s)f[s++]=0;if(m)mypc('-');while(s--)mypc(f[s]+'0');mypc(c);} void writer(ll x, char c){int s=0,m=0;char f[20];if(x<0)m=1,x=-x;while(x)f[s++]=x%10,x/=10;if(!s)f[s++]=0;if(m)mypc('-');while(s--)mypc(f[s]+'0');mypc(c);} void writer(const char c[]){int i;for(i=0;c[i]!='\0';i++)mypc(c[i]);} void writer(const char x[], char c){int i;for(i=0;x[i]!='\0';i++)mypc(x[i]);mypc(c);} template void writerLn(T x){writer(x,'\n');} template void writerLn(T x, S y){writer(x,' ');writer(y,'\n');} template void writerLn(T x, S y, U z){writer(x,' ');writer(y,' ');writer(z,'\n');} template void writerArr(T x[], int n){int i;if(!n){mypc('\n');return;}rep(i,n-1)writer(x[i],' ');writer(x[n-1],'\n');} template void* setUndirectEdge(int N, int M, int A[], int B[], T C[], int **es, int ***edge, T ***cost, void *workMemory){int i;*es=(int*)workMemory;*edge=(int**)((*es)+N);(*edge)[0]=(int*)((*edge)+N);rep(i,N)(*es)[i]=0;rep(i,M)(*es)[A[i]]++,(*es)[B[i]]++;REP(i,1,N)(*edge)[i]=(*edge)[i-1]+(*es)[i-1];(*cost)=(T**)((*edge)[N-1]+(*es)[N-1]);(*cost)[0]=(T*)((*cost)+N);REP(i,1,N)(*cost)[i]=(*cost)[i-1]+(*es)[i-1];workMemory=(void*)((*cost)[N-1]+(*es)[N-1]);rep(i,N)(*es)[i]=0;rep(i,M)(*edge)[A[i]][(*es)[A[i]]]=B[i],(*cost)[A[i]][(*es)[A[i]]++]=C[i],(*edge)[B[i]][(*es)[B[i]]]=A[i],(*cost)[B[i]][(*es)[B[i]]++]=C[i];return workMemory;} template void sort(int N, T a[], void *mem = NULL){sort(a,a+N);} template void sort(int N, T1 a[], T2 b[], void *mem){int i;pair *r=(pair*)mem;rep(i,N)r[i].first=a[i],r[i].second=b[i];sort(r,r+N);rep(i,N)a[i]=r[i].first,b[i]=r[i].second;} template void sort(int N, T1 a[], T2 b[], T3 c[], void *mem){int i;pair > *r=(pair >*)mem;rep(i,N)r[i].first=a[i],r[i].second.first=b[i],r[i].second.second=c[i];sort(r,r+N);rep(i,N)a[i]=r[i].first,b[i]=r[i].second.first,c[i]=r[i].second.second;} template void sort(int N, T1 a[], T2 b[], T3 c[], T4 d[], void *mem){int i;pair,pair > *r=(pair,pair >*)mem;rep(i,N)r[i].first.first=a[i],r[i].first.second=b[i],r[i].second.first=c[i],r[i].second.second=d[i];sort(r,r+N);rep(i,N)a[i]=r[i].first.first,b[i]=r[i].first.second,c[i]=r[i].second.first,d[i]=r[i].second.second;} void unionInit(int d[],int s){int i;rep(i,s)d[i]=i;} int unionGet(int d[],int n){int t=n,k;while(d[t]!=t)t=d[t];while(d[n]!=n)k=d[n],d[n]=t,n=k;return n;} int unionConnect(int d[],int a,int b){a=unionGet(d,a);b=unionGet(d,b);if(a==b)return 0;d[a]=b;return 1;} #define INF 1000000000 int N, M, T; int A[10000], B[10000], C[10000]; int mat[99][99]; int V[1000], use[1000]; int *es, **edge, **cost; int prefield(){ const int n = N; const int numT = T; if (numT <= 1) return 0; static int OPT[(1 << 15)][38]; for (int S = 0; S < (1 << numT); ++S) for (int x = 0; x < n; ++x) OPT[S][x] = INF; for (int p = 0; p < numT; ++p) // trivial case for (int q = 0; q < n; ++q) OPT[1 << p][q] = mat[V[p]][q]; for (int S = 1; S < (1 << numT); ++S) { // DP step if (!(S & (S-1))) continue; for (int p = 0; p < n; ++p) for (int E = 0; E < S; ++E) if ((E | S) == S) OPT[S][p] = min( OPT[S][p], OPT[E][p] + OPT[S-E][p] ); for (int p = 0; p < n; ++p) for (int q = 0; q < n; ++q) OPT[S][p] = min( OPT[S][p], OPT[S][q] + mat[p][q] ); } int ans = INF; for (int S = 0; S < (1 << numT); ++S) for (int q = 0; q < n; ++q) ans = min(ans, OPT[S][q] + OPT[((1 << numT)-1)-S][q]); return ans; } int main(){ int i, j, k, mask; int res = INF, tmp, r; int ind[100]; void *mem = malloc(10000000); reader(&N,&M,&T); rep(i,M) reader(A+i,B+i,C+i), A[i]--, B[i]--; rep(i,T) reader(V+i), V[i]--; rep(i,N) rep(j,N) mat[i][j] = INF; rep(i,N) mat[i][i] = 0; rep(i,M) mat[A[i]][B[i]] = mat[B[i]][A[i]] = C[i]; rep(k,N) rep(i,N) rep(j,N) mat[i][j] = min(mat[i][j], mat[i][k]+mat[k][j]); if(T <= 13){ res = prefield(); } else { rep(i,N) use[i] = 1; rep(i,T) use[V[i]] = 0; T = 0; rep(i,N) if(use[i]) V[T++] = i; sort(M,C,A,B,mem); rep(mask, 1<= res || r==0) break; } rep(i,T) if(mask&1<