#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+10;
const int inf=1e18;
int T;
int n,m,k,x[N],y[N],z[N];
int a[N];
int ver[N],head[N],Next[N],edge[N],tot;
int s,t;
int d[N],vis[N];
priority_queue<pair<int,int> >q;
int ans;
int dijkstra() {
while(!q.empty()) q.pop();
for(int i=1;i<=n+2;i++) d[i]=inf,vis[i]=0;
d[s]=0;
q.push(make_pair(-d[s],s));
while(!q.empty()) {
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=Next[i]) {
int y=ver[i],z=edge[i];
if(d[y]>d[x]+z) {
d[y]=d[x]+z;
q.push(make_pair(-d[y],y));
}
}
}
return d[t];
}
void add(int x,int y,int z) {
ver[++tot]=y;
edge[tot]=z;
Next[tot]=head[x];
head[x]=tot;
}
void build_graph() {
for(int i=1;i<=n+2;i++) ver[i]=head[i]=Next[i]=edge[i]=0;
tot=0;
for(int i=1;i<=m;i++) add(x[i],y[i],z[i]);
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--) {
cin>>n>>m>>k;
for(int i=1;i<=m;i++) cin>>x[i]>>y[i]>>z[i];
s=n+1,t=n+2;
ans=inf;
for(int i=1;i<=k;i++) cin>>a[i];
for(int i=0;(1<<i)<=k;i++) {
build_graph();
for(int j=1;j<=k;j++) {
if(j&(1<<i)) add(s,a[j],0);
else add(a[j],t,0);
}
ans=min(ans,dijkstra());
build_graph();
for(int j=1;j<=k;j++) {
if((j&(1<<i))^1) add(s,a[j],0);
else add(a[j],t,0);
}
ans=min(ans,dijkstra());
}
cout<<ans<<endl;
}
return 0;
}
第 3 和第 9 个点 WA。