#include<cstdio>
#include<bitset>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define il inline
#define Fo(i,a,b) for(register int i=a;i<=b;i++)
#define inf 0x3f3f3f3f3f3f3f3f
const int N=1e5+5;
int n,m,k;
ll ans;
struct eage{
int to,vis;
};
struct node{
int x;ll dis;
inline bool operator <(const node &a)const{
return a.dis<dis;
}
};
template<typename T>
il void read(T &x){
int f=1;x=0;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;
}
vector<eage>e[N];
vector<int>xy;
bitset<N>f,o;
int cnt=0;
il void init(){
read(n);read(m);read(k);
int a,b;ll c;
while(m--){
read(a);read(b);read(c);
e[a].push_back((eage){b,c});
}
while(k--){
read(a);f[a]=1;
xy.push_back(a);
}
}
il void dijkstra(int st){
priority_queue<node>q;o.reset();
q.push((node){st,0});
while(!q.empty()){
cnt++;
int x=q.top().x;ll dis=q.top().dis;q.pop();
if(o[x])continue;o[x]=1;
if(f[x]&&x!=st||dis>=ans){
if(dis<ans)ans=dis;
return;
}
Fo(i,0,int(e[x].size()-1)){
int u=e[x][i].to,w=e[x][i].vis;
q.push((node){u,dis+w});
}
}
}
il void cclear(){
Fo(i,1,n)e[i].clear();
xy.clear();f.reset();
}
int main(){
int t;read(t);
while(t--){
init();ans=inf;
Fo(i,0,int(xy.size()-1)){
dijkstra(xy[i]);
if(cnt>5000000)break;
}
printf("%d\n",ans);
cclear();
}
return 0;
}