#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <vector>
#include <set>
#include <map>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <string>
#include <cmath>
#include <bitset>
#include <stack>
#include <math.h>
#include <functional>
#define ull unsigned long long
#define ll long long
#define pii pair<ll ,ll>
#define cy cout<<"YES"<<'\n'
#define cn cout<<"NO"<<'\n'
#define forn(i,begin,end,add) for(ll (i)=(begin);(i)<=(end);(i)+=(add))
#define rforn(i,begin,end,sub) for(ll (i)=(end);(i)>=(begin);(i)-=(sub))
#define vv vector
#define inf32 INT32_MAX/2
#define inf64 INT64_MAX/2
#define LD double
#define PI acos(-1)
#define debug(a,b) cout<<a<<b
#define eps 1e-12
const int N = 4e5 + 100;
const int mod = 998244353;
ll T;
vv<vv<pii>>tree;
int n, m;
int b;
void dj(int s, vv<ll>& d) {
priority_queue<pii>q;
vv<int>vis(d.size());
d[s] = 0; q.push({ 0,s });
int cnt = 0;
while (q.size()) {
auto t = q.top();
q.pop();
int u = t.second;
if (vis[u])continue;
vis[u] = 1;
for (auto ed : tree[u]) {
int v = ed.first, w = ed.second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
q.push({ -d[v],v });
}
}
}
}
void solve() {
cin >> n;
int k;
int m; cin >> m; cin >> k;
tree.clear();
tree.resize(n + 1);
forn(i, 1, m, 1) {
int a, b; cin >> a >> b;
int w; cin >> w;
tree[a].push_back({ b,w });
}
vv<int>use(k);
forn(i, 0, k - 1, 1)
cin >> use[i];
sort(use.begin(), use.end());
ll flag = 1;
ll ans = inf64;
while (1) {
if (flag > use.back()) {
break;
}
vv<int>u1;
vv<int>u2;
for (auto a : use) {
if (a & flag)
u1.push_back(a);
else
u2.push_back(a);
}
if (!u1.size() || !u2.size())
continue;
forn(i, 0, (int)u1.size() - 1 - 1, 1) {
tree[u1[i]].push_back({ u1[i + 1],0 });
tree[u1[i + 1]].push_back({ u1[i],0 });
}
forn(i, 0, (int)u2.size() - 1 - 1, 1) {
tree[u2[i]].push_back({ u2[i + 1],0 });
tree[u2[i + 1]].push_back({ u2[i],0 });
}
vv<ll>d(n + 1, inf64);
for (auto a : u1)
if (d[a] == inf64)
dj(a, d);
for (auto a : u2)
ans = min(ans, d[a]);
d = vv<ll>(n + 1, inf64);
for (auto a : u2)
if (d[a] == inf64)
dj(a, d);
for (auto a : u1)
ans = min(ans, d[a]);
forn(i, 0, (int)u1.size() - 1 - 1, 1) {
tree[u1[i]].pop_back();
tree[u1[i + 1]].pop_back();
}
forn(i, 0, (int)u2.size() - 1 - 1, 1) {
tree[u2[i]].pop_back();
tree[u2[i + 1]].pop_back();
}
flag <<= 1;
}
cout << ans << endl;
}
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
T = 1;
cin >> T;
while (T--)
solve();
return 0;
}