#include<bits/stdc++.h>
#define db double
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
struct node{
int pos,val;
bool operator<(const node &x)const{
return val>x.val;
}
};
const int mxn=1e5+10;
int s,t,n,m,k,a[mxn],dis[mxn],ans;
vector<pii>E[mxn];
bool vis[mxn];
void dijkstra(){
priority_queue<node>q;
q.push((node){0,0});
for(int i=1;i<=n+1;i++)
dis[i]=1e18,vis[i]=0;
dis[1]=0;
while(!q.empty()){
int u=q.top().pos;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(auto v:E[u]){
if(dis[v.fi]>dis[u]+v.se){
dis[v.fi]=dis[u]+v.se;
if(!vis[v.fi])q.push((node){v.fi,dis[v.fi]});
}
}
}
ans=min(ans,dis[n+1]);
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T=read();
while(T--){
s=0,t=n+1;
n=read(),m=read(),k=read();
for(int i=0;i<=n+1;i++)
E[i].clear();
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
E[u].pb(mkp(v,k));
E[v].pb(mkp(u,k));
}
for(int i=1;i<=k;i++)
a[i]=read();
ans=1e18;
for(int i=0;i<20;i++){
for(int j=1;j<=k;j++){
if((j>>i)&1)E[0].pb(mkp(a[j],0));
else E[a[j]].pb(mkp(n+1,0));
}
dijkstra();
for(int j=1;j<=k;j++)
if(!((j>>i)&1))E[a[j]].pop_back();
E[0].clear();
}
printf("%lld\n",ans);
}
return 0;
}