WA on #1,#2,#3,#4,#8
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<cstdlib>
using namespace std;
#define ll long long
#define ull unsigned long long
int read()
{
int now=0,nev=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-')
nev=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
now=(now<<1)+(now<<3)+(c&15);
c=getchar();
}
return now*nev;
}
const int MAXN=1e5+10;
const int MAXM=5e5+10;
int n,m,k;
int a[MAXN];
int head[MAXM],tt=0;
struct edge
{
int to,nxt,dis;
}e[MAXM<<1];
void add(int x,int y,int z)
{
e[++tt].nxt=head[x];
head[x]=tt;
e[tt].to=y;
e[tt].dis=z;
}
struct node
{
int u;
ll d;
bool operator < (const node&x)const
{
return d>x.d;
}
};
ll dis[2][MAXN];//要跑两遍Dijkstra,dis[0][u]表示正着跑,dis[1][u]表示反着跑
int color[2][MAXN];
int fx[MAXM],fy[MAXM],fz[MAXM];
priority_queue<node>q;
void Dijkstra(int id)
{
memset(dis[id],60,sizeof(dis[id]));
memset(color[id],0,sizeof(color[id]));
for(int i=1;i<=k;i++)
{
dis[id][a[i]]=0;
color[id][a[i]]=a[i];
q.push((node){a[i],0});
}
while(!q.empty())
{
node first=q.top();
q.pop();
int u=first.u;
ll d=first.d;
if(d!=dis[id][u])
continue;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
ll w=e[i].dis;
if(dis[id][v]>dis[id][u]+w)
{
dis[id][v]=dis[id][u]+w;
color[id][v]=color[id][u];
q.push((node){v,dis[id][v]});
}
}
}
}
int main()
{
int t;
t=read();
while(t--)
{
memset(head,0,sizeof(head));
n=read(),m=read(),k=read();
for(int i=1;i<=m;i++)
{
int x,y,z;
x=read(),y=read(),z=read();
fx[i]=x,fy[i]=y,fz[i]=z;
if(x!=y)
add(x,y,z);
}
for(int i=1;i<=k;i++)
a[i]=read();
Dijkstra(0);//正着跑Dijkstra
tt=0;
memset(head,0,sizeof(head));
for(int i=1;i<=m;i++)
{
if(fx[i]!=fy[i])
add(fy[i],fx[i],fz[i]);
}
Dijkstra(1);//反着跑Dijkstra
ll ans=1e18;
for(int i=1;i<=n;i++)
{
int u=fx[i],v=fy[i],w=fz[i];
if(color[0][u] && color[1][v] && color[0][u]!=color[1][v])
ans=min(ans,dis[0][u]+dis[1][v]+w);
}
printf("%lld\n",ans);
}
return 0;
}