#include<set>
#include<list>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
#define min(a,b) a<b?a:b
inline int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s*w;
}
inline void write(int x) {
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void print(int x,char ch='\n') {
if(x<0)putchar('-');
write(__builtin_labs(x));
putchar(ch);
}
int n,m,k,ans,cnt;
int head[1000001],Next[1000001],ver[1000001],edge[1000001],d[500001];
bool v[1000001],hp[1000001];
priority_queue<pair<int,int> >q;
void add(int z,int y,int x) {
ver[++cnt]=y;
edge[cnt]=z;
Next[cnt]=head[x];
head[x]=cnt;
// swap(x,y);
// ver[++cnt]=y;
// edge[cnt]=z;
// Next[cnt]=head[x];
// head[x]=cnt;
}
int dij(int v0) {
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
while(!q.empty())q.pop();
q.push(make_pair(0,v0));
d[v0]=0;
while(!q.empty()) {
int x=q.top().second;
q.pop();
if(v[x])continue;
if(hp[x]&&x!=v0) return d[x];
v[x]=1;
for(int i=head[x]; i; i=Next[i]) {
int y=ver[i],z=edge[i];
if(d[y]>d[x]+z) {
d[y]=d[x]+z;
q.push(make_pair(-d[y],y));
}
}
}
return 0x3f3f3f3f3f3f3f3f;
}
void memset(){
memset(hp,0,sizeof(hp));
memset(head,0,sizeof(head));
memset(Next,0,sizeof(Next));
memset(ver,0,sizeof(ver));
memset(edge,0,sizeof(edge));
}
signed main() {
for(int t=read(); t; t--) {
n=read(),m=read(),k=read(),ans=0x7fffffffffffffff;
memset();
for(int i=1; i<=m; i++)add(read(),read(),read());
for(int i=1; i<=k; i++)hp[read()]=1;
for(int i=1;i<=n;i++)if(hp[i])ans=min(ans,dij(i));
print(ans);
}
return 0;
}
为什么WA最后一个点