/*
分析:
我一开始竟然用了S*D次Dijkstra……
用S次就能ac了,不过要100+MS,当然,枝剪一下时间就下来了,
下面的是我的31MS的。+_+0MS的都是怎么办到的……
2012-05-30
*/
分析:
我一开始竟然用了S*D次Dijkstra……
用S次就能ac了,不过要100+MS,当然,枝剪一下时间就下来了,
下面的是我的31MS的。+_+0MS的都是怎么办到的……
2012-05-30
*/
#include"stdio.h"
#include"string.h"
struct A
{
int ans;
int flag;
int pre;
}E[1010];
int map[1010][1010];
int main()
{
int i,l,j;
int s[555],e[555];
int k;
int hash[1010]; //记录第几个城市是否出现
int a,b,c;
int t1,t2,t3;
int min;
while(scanf("%d%d%d",&a,&b,&c)!=-1)
{
memset(map,0,sizeof(map));
memset(hash,0,sizeof(hash));
for(i=0;i<a;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
hash[t1]=hash[t2]=1;
if(map[t1][t2]==0) map[t1][t2]=map[t2][t1]=t3;
else if(map[t1][t2]>t3) map[t1][t2]=map[t2][t1]=t3;
}
for(i=0;i<b;i++) {scanf("%d",&s[i]);hash[s[i]]=1;}
for(i=0;i<c;i++) {scanf("%d",&e[i]);hash[e[i]]=1;}
min=111111111;
for(i=0;i<b;i++)
{
for(j=1;j<1010;j++)
{
if(hash[j])
{
E[j].ans=111111111;
E[j].flag=1;
E[j].pre=j;
}
}
k=s[i];
E[k].ans=0;
while(k)
{
if(E[k].ans>=min) break;
E[k].flag=0;
for(j=1;j<1010;j++)
{
if(map[k][j]&&E[j].ans>E[k].ans+map[k][j])
{
E[j].ans=E[k].ans+map[k][j];
E[j].pre=k;
}
}
k=0;
for(j=1;j<1010;j++) if(hash[j]&&E[j].flag) {k=j;break;}
for(j++;j<1010;j++) if(hash[j]&&E[j].flag&&E[j].ans<E[k].ans) k=j;
}
for(l=0;l<c;l++) min=min>E[e[l]].ans?E[e[l]].ans:min;
}
printf("%d\n",min);
}
return 0;
}