#include<iostream>
#include<queue>
#include<cstring>
#define int long long
#define P pair<long long, long long>
using namespace std;
const int N = 1e5 + 100;
const int M = 5e5 + 100;
int cnt, Cnt, first[N], First[N];
struct Node
{
int to, w, next;
}edge[M + N];
void add(int from, int to, int w)
{
edge[++cnt].to = to;
edge[cnt].w = w;
edge[cnt].next = first[from];
first[from] = cnt;
}
int n, m, k, s, t, ans;
int node[N], d[N], vis[N];
int dijkstra()
{
for (int i = 1; i <= n + 2; ++i) d[i] = 1e16 + 9, vis[i] = 0;
priority_queue<P, vector<P>, greater<P> > q;
d[s] = 0;
q.push(P(d[s], s));
while (!q.empty())
{
int x = q.top().second;
q.pop();
if (vis[x]) continue;
vis[x] = 1;
if (x == t) break;
for (int i = first[x]; i; i = edge[i].next)
{
int y = edge[i].to;
int w = edge[i].w;
if (d[x] + w < d[y])
{
d[y] = d[x] + w;
q.push(P(d[y], y));
}
}
}
return d[t];
}
signed main()
{
int T;
cin >> T;
while (T--)
{
cin >> n >> m >> k;
s = n + 1;
t = n + 2;
ans = 1e16 + 9;
memset(first, 0, sizeof(first));
memset(First, 0, sizeof(First));
cnt = Cnt = 0;
for (int i = 1; i <= m; ++i)
{
int x, y, z;
cin >> x >> y >> z;
add(x, y, z);
}
for (int i = 1; i <= k; ++i)
{
cin >> node[i];
}
for (int i = 1; i <= n + 2; ++i) First[i] = first[i];
Cnt = cnt;
for (int i = 0; ((int)1 << i) <= k; ++i)
{
for (int j = 1; j <= k; ++j)
{
if (((int)1 << i) & node[j])
{
add(s, node[j], 0);
}
else
{
add(node[j], t, 0);
}
}
ans = min(ans, dijkstra());
for (int j = 1; j <= n + 2; ++j) first[j] = First[j];
cnt = Cnt;
for (int j = 1; j <= k; ++j)
{
if (((int)1 << i) & node[j])
{
add(node[j], t, 0);
}
else
{
add(s, node[j], 0);
}
}
ans = min(ans, dijkstra());
for (int j = 1; j <= n + 2; ++j) first[j] = First[j];
cnt = Cnt;
}
cout << ans << endl;
}
}