#include<iostream>
#include<unordered_map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define int long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ai_jiang signed main()
using namespace std;
typedef long long ll;
using poly = vector<ll>;
namespace ai {
constexpr int N = 1e5+10,M = 5e5+10;
int t,n,m,k,a,b,c,dis[N],ptr[N];
vector<pair<int,int>> e[N];
vector<int> aa[32],bb[32];
bool vis[N];
struct node {
int sum,now;
bool operator<(const node &b) const {
return sum>b.sum;
}
};
void dijk(int st) {
priority_queue<node> q;
q.push({0,st});
fill(dis+1,dis+n+1,1e18);
memset(vis,0,sizeof(vis));
dis[st]=0;
while(!q.empty()) {
auto x=q.top();
q.pop();
if(vis[x.now]) continue;
vis[x.now]=1;
for(auto p:e[x.now]) {
int v=p.first,w=p.second;
if(dis[v]>dis[x.now]+w) {
dis[v]=dis[x.now]+w;
q.push({dis[v],v});
}
}
}
}
void rikka() {
rep(i,1,n) e[i].clear();
cin>>n>>m>>k;
rep(i,0,31) aa[i].clear(),bb[i].clear();
rep(i,1,m) {
cin>>a>>b>>c;
e[a].push_back({b,c});
}
int p=__lg(n)+1;
rep(i,1,k) cin>>ptr[i];
rep(i,0,p-1) {
rep(j,1,k) {
if((ptr[j]>>i)&1) aa[i].push_back(ptr[j]);
else bb[i].push_back(ptr[j]);
}
}
int ans=2e9;
rep(i,0,p-1) {
e[0].clear(); e[n+1].clear();
for(auto j:aa[i]) e[0].push_back({j,0});
for(auto j:bb[i]) e[n+1].push_back({j,0});
dijk(0);
for(auto j:bb[i]) ans=min(ans,dis[j]);
dijk(n+1);
for(auto j:aa[i]) ans=min(ans,dis[j]);
}
cout<<ans<<'\n';
}
}
using namespace ai;
ai_jiang {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin>>t;
while(t--) rikka();
return 0;
}