
#include<bits/stdc++.h>
using namespace std;
#define INF 10000000
const int maxv=2000;
int cost[maxv][maxv];
int d[maxv];
bool vis[maxv];
int x[2000];
int y[2000];
int path[2000];
int e,s,di;
int a,b,tt;
int ans;
int ver;
void dijkstra(int n,int st)
{
int i,j,minn,pre;
memset(vis,0,sizeof(vis));
vis[st]=1;
for(i=0;i<n;i++)
{
d[i]=cost[st][i];
path[i]=st;
}
d[st]=0;
path[st]=-1;
pre=st;
for(i=1;i<n;i++)
{
for(j=1;j<n;j++)
{
if(vis[j]==0&&d[pre]+cost[pre][j]<d[j])
d[j]=d[pre]+cost[pre][j],path[j]=pre;
}
minn=INF;
for(j=1;j<n;j++)
{
if(vis[j]==0&&d[j]<minn)
minn=d[j],pre=j;
}
vis[pre]=1;
}
return ;
}
int main()
{
while(scanf("%d %d %d",&e,&s,&di)!=EOF)
{
for(int i=0;i<1200;i++)
{
for(int j=0;j<1200;j++)
{
cost[i][j]=INF;
}
cost[i][i]=0;
}
ver=0;
for(int i=0;i<e;i++)
{
scanf("%d %d %d",&a,&b,&tt);
cost[a][b]=min(tt,cost[a][b]);
cost[b][a]=min(tt,cost[a][b]);
ver=max(max(ver,a),b);
}
for(int i=0;i<s;i++)
{
scanf("%d",&x[i]);
cost[0][x[i]]=0;
cost[x[i]][0]=0;
}
for(int i=0;i<di;i++)
{
scanf("%d",&y[i]);
}
ans=INF;
dijkstra(ver+1,0);
for(int j=0;j<di;j++)
{
ans=min(ans,d[y[j]]);
}
printf("%d
",ans);
}
return 0;
}
