#include <bits/stdc++.h>
using namespace std;
const int maxn=100005;
int x,y,z;
int n,m,st,T,k,a[maxn],b[maxn],vis[maxn];
long long dis[maxn],ans;
vector <int >son[maxn];
vector <int >val[maxn];
queue <int >q;
void read(){
cin>>n>>m>>k;
ans=0x3f3f3f3f3f3f;
for(int i=0;i<maxn;i++){
son[i].clear();
val[i].clear();
}
memset(dis,0x3f,sizeof(dis));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
if(x==y) continue;
son[x].push_back(y);
val[x].push_back(z);
}
for(int i=1;i<=k;i++){
cin>>x;
b[i]=x;
a[x]=1;
}
}
long long work(){
q.push(0);
vis[0]=1;
while(!q.empty()){
int now=q.front();
q.pop();
// cout<<now<<' '<<son[now].size()<<' '<<dis[now]<<endl;
vis[now]=0;
for(int i=0;i<son[now].size();i++){
int j=son[now][i];
if(j==0) continue;
// cout<<" "<<j<<endl;
if(dis[j]>dis[now]+val[now][i]){
dis[j]=dis[now]+val[now][i];
if(!vis[j]){
vis[j]=1;
q.push(j);
}
}
}
}
return dis[100003];
}
void solve(){
read();
for(int i=0;i<=15;i++){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[0]=0;
son[0].clear();
val[0].clear();
// cout<<i<<endl;
for(int j=1;j<=k;j++){
if(((1<<i)&j)!=0){
son[0].push_back(b[j]);
val[0].push_back(0);
}
if(((1<<i)&j)==0){
son[b[j]].push_back(100003);
val[b[j]].push_back(0);
}
}
ans=min(ans,work());
for(int j=1;j<=k;j++){
if(((1<<i)&j)==0){
son[b[j]].pop_back();
val[b[j]].pop_back();
}
}
////
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[0]=0;
son[0].clear();
val[0].clear();
// cout<<i<<endl;
for(int j=1;j<=k;j++){
if(((1<<i)&j)==0){
son[0].push_back(b[j]);
val[0].push_back(0);
}
if(((1<<i)&j)!=0){
son[b[j]].push_back(100003);
val[b[j]].push_back(0);
}
}
ans=min(ans,work());
for(int j=1;j<=k;j++){
if(((1<<i)&j)!=0){
son[b[j]].pop_back();
val[b[j]].pop_back();
}
}
}
////
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>T;
while(T--) solve();
return 0;
}
这题是不是卡SPFA