/*
分析:
贪心或者树形dp。
贪心的话和kruskal有点儿像,就分到最小生成树
里面了。
2013-04-22
*/
分析:
贪心或者树形dp。
贪心的话和kruskal有点儿像,就分到最小生成树
里面了。
2013-04-22
*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"algorithm"
using namespace std;
const int N=100111;
int n,m;
int flag[N],pre[N];
struct node{
int a,b,c;
}edge[N];
int cmp(node n1,node n2){
return n2.c<n1.c;
}
int find(int k)
{
if(pre[k]==k) return k;
pre[k]=find(pre[k]);
return pre[k];
}
__int64 solve()
{
int i,t,f1,f2;
__int64 ans=0;
t=n-1;
for(i=0;i<n;i++) pre[i]=i;
for(i=0;i<t;i++)
{
f1=find(edge[i].a);
f2=find(edge[i].b);
if(flag[f1] && flag[f2]) ans+=edge[i].c;
else
{
pre[f2]=f1;
flag[f1]=flag[f1] || flag[f2];
}
}
return ans;
}
int main()
{
int T;
int i;
int t,temp;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
t=n-1;
for(i=0;i<t;i++) scanf("%d%d%d",&edge[i].a,&edge[i].b,&edge[i].c);
sort(edge,edge+t,cmp);
memset(flag,0,sizeof(flag));
for(i=0;i<m;i++) {scanf("%d",&temp);flag[temp]=1;}
printf("%I64d\n",solve());
}
return 0;
}