#include<bits/stdc++.h>
using namespace std;
int t;
int n,m,k,cnt;
struct Edge{
int to,nxt,val;
}edge[1000010];
long long las[1000010],vis[1000010];
struct node{
int x;
long long y;
bool operator<(node hh) const{return y>hh.y;}
};
void add(int u,int v,int w){
cnt++;
edge[cnt].to=v;
edge[cnt].nxt=las[u];
las[u]=cnt;
edge[cnt].val=w;
}
priority_queue<node> pq;
bitset<5000010>dd,ff;
long long Distria(int now){
while(!pq.empty()){
pq.pop();
}
dd.reset();
memset(vis,0x3f,sizeof vis);
pq.push((node){now,0});
vis[now]=0;
while(!pq.empty()){
node t=pq.top();
pq.pop();
int u=t.x;
if(ff[u]&&u!=now){
return vis[u];
}
if(!dd[u]){
dd[u]=1;
for(int i=las[u];i;i=edge[i].nxt){
int v=edge[i].to;
int w=edge[i].val;
if(vis[v]>vis[u]+w){
vis[v]=vis[u]+w;
pq.push((node){v,vis[v]});
}
}
}
}
return 0x3f3f3f3f3f3f3f3f;
}
int main(){
cin>>t;
while(t--){
cnt=0;
memset(las,0,sizeof(las));
ff.reset();
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(int i=1;i<=k;i++){
int x;
scanf("%d",&x);
ff[x]=1;
}
long long ans=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=n;i++){
if(ff[i]){
ans=min(Distria(i),ans);
}
}
printf("%lld\n",ans);
}
return 0;
}