/*
最大生成树+贪心
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 100005
struct Edge
{
int s,t;
int w;
}edge[maxn];
int set[maxn];
bool visted[maxn];
bool cmp(Edge a,Edge b)
{
return a.w>b.w;
}
int find(int x)
{
if(x==set[x])
return x;
return set[x]=find(set[x]);
}
void Union(int x,int y)
{
set[x]=y;
if(visted[x])
{
visted[y]=1;
}
else if(visted[y])
{
visted[x]=1;
}
}
int n;
__int64 solve()
{
sort(edge,edge+n-1,cmp);
//printf("***\n");
for(int i=0;i<=n;i++)
set[i]=i;
//for(int i=0;i<n-1;i++)
// printf("%d %d %d\n",edge[i].s,edge[i].t,edge[i].w);
__int64 sum=0;
for(int i=0;i<n-1;i++)
{
int fx=find(edge[i].s);
int fy=find(edge[i].t);
if(visted[fx] && visted[fy])
{
sum+=edge[i].w;
continue;
}
Union(fx,fy);
//visted[edge[i].s]=1;
//visted[edge[i].t]=1;
// printf("%d+++",sum);
}
return sum;
}
int main()
{
int t,i,x;
int m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(visted,0,sizeof(visted));
for(i=0;i<n-1;i++)
{
scanf("%d%d%d",&edge[i].s,&edge[i].t,&edge[i].w);
}
while(m--)
{
scanf("%d",&x);
visted[x]=1;
}
printf("%I64d\n",solve());
}
return 0;
}