#include<bits/stdc++.h>
#define ll long long
#define rev(x) reverse(x.begin(),x.end())
using namespace std;
const int maxn=1e5+5,maxm=5e5+5;
struct edge{int to,nxt;ll val;}e[maxm];int head[maxn],cnt=1;
inline void add(int x,int y,ll w){
e[cnt]=(edge){y,head[x],w};
head[x]=cnt++;
}
int head_bk[maxn],cnt_bk=1;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
struct nod{
int x;ll val;
bool operator<(const nod&q)const{return val>q.val;}
};
int n,m,k;
ll ans=0x3f3f3f3f3f3f3f;
int special[maxn];
ll dis[maxn];
inline void dij(){
priority_queue<nod> que;
for(int i=0;i<=n+1;i++) dis[i]=0x3f3f3f3f3f3f3f;
dis[0]=0;
que.push((nod){0,0});
while(que.size()){
nod fr=que.top();que.pop();
if(fr.x==n+1&&fr.val<ans) ans=fr.val;
if(fr.val>dis[fr.x]) continue;
dis[fr.x]=fr.val;
for(int i=head[fr.x];i;i=e[i].nxt) if(fr.val+e[i].val<dis[e[i].to]) que.push((nod){e[i].to,fr.val+e[i].val});
}
}
int main(){
int t=read();
while(t--){
for(int i=0;i<=n+1;i++) head[i]=0;
cnt=1;
n=read(),m=read(),k=read();
for(int i=1;i<=m;i++){
int a=read(),b=read();ll c=read();
add(a,b,c);
}
for(int i=1;i<=k;i++) special[i]=read();
//存档
for(int i=0;i<=n+1;i++) head_bk[i]=head[i];
cnt_bk=cnt;
for(int bt=0;(n>>bt);bt++){
//虚拟源点/汇点
for(int i=1;i<=k;i++){
if(((special[i])>>bt)&1) add(0,special[i],0);
else add(special[i],n+1,0);
}
dij();
//回档
for(int i=0;i<=n+1;i++) head[i]=head_bk[i];
cnt=cnt_bk;
//虚拟源点/汇点
for(int i=1;i<=k;i++){
if(((special[i])>>bt)&1) add(special[i],n+1,0);
else add(0,special[i],0);
}
dij();
//回档
for(int i=0;i<=n+1;i++) head[i]=head_bk[i];
cnt=cnt_bk;
}
cout<<ans<<endl;
ans=0x3f3f3f3f3f3f3f;
}
return 0;
}
memset都删了啊 怎么还是MLE)