#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 1000+10 const int inf=1<<29; int w[N][N],vis[N],d[N]; int num1[N],num2[N]; int t,s,D; void dij(int v,int n) { int i,j; for(i=1;i<=n;i++) { d[i]=w[v][i]; vis[i]=0; } d[v]=0; vis[v]=1; for(i=1;i<=n;i++) { int now=inf,k; for(j=1;j<=n;j++) { if(!vis[j]&&d[j]<now) { now=d[j]; k=j; } } if(now==inf) { break; } vis[k]=1; for(j=1;j<=n;j++) { if(!vis[j]&&d[j]>d[k]+w[k][j]) { d[j]=d[k]+w[k][j]; } } } } int main() { while(scanf("%d%d%d",&t,&s,&D)!=EOF) { int i,j; for(i=1;i<=N;i++) { for(j=1;j<=N;j++) { if(i==j) { w[i][j]=0; } else { w[i][j]=inf; } } } int u,v,c; int Max=-inf; while(t--) { scanf("%d%d%d",&u,&v,&c); Max=max(Max,max(u,v)); if(c<w[u][v]) { w[u][v]=w[v][u]=c; } } for(i=0;i<s;i++) { scanf("%d",&num1[i]); } for(i=0;i<D;i++) { scanf("%d",&num2[i]); } int MIN=inf; for(i=0;i<s;i++) { dij(num1[i],Max); for(j=0;j<D;j++) { MIN=min(MIN,d[num2[j]]); } } printf("%d\n",MIN); } return 0; }