#include<bits/stdc++.h>
#define int long long
using namespace std;
int fa[100005][20],dis[100005],dep[100005],check[100005],maxx;
int num[100005],got[100005],l[100005],r[100005],ans[100005];
struct edge{int a,b,p;}y[100005];
vector<pair<int,int> >z[100005];
int findd(int now){
if(got[now]==now)return now;
return got[now]=findd(got[now]);
}
void dfs(int now,int father){
fa[now][0]=father;
for(int i=0;i<z[now].size();i++){
if(z[now][i].first!=father){
dep[z[now][i].first]=dep[now]+1;
dis[z[now][i].first]=dis[now]+z[now][i].second;
dfs(z[now][i].first,now);
}
}
return;
}
pair<int,int>dfs2(int now,int father,int summ){
pair<int,int>b;
b.first=summ;
b.second=now;
for(int i=0;i<z[now].size();i++){
if(z[now][i].first!=father){
pair<int,int>a=dfs2(z[now][i].first,now,summ+z[now][i].second);
if(a.first>b.first)b=a;
}
}
return b;
}
int jump(int a,int b){
int ned=dep[a]-dep[b];
for(int i=17;i>=0;i--)if(ned&(1<<i))a=fa[a][i];
return a;
}
int LCA(int a,int b){
if(a==b)return a;
for(int i=17;i>=0;i--){
if(fa[a][i]!=fa[b][i]){
a=fa[a][i];
b=fa[b][i];
}
}
return fa[a][0];
}
int far(int a,int b){
if(dep[a]<dep[b])swap(a,b);
int d=jump(a,b);
int c=LCA(d,b);
return dis[a]+dis[b]-dis[c]*2ll;
}
signed main(){
int T;
scanf("%lld",&T);
while(T--){
maxx=0;
int n,q;
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++){
z[i].clear();
dis[i]=dep[i]=check[i]=l[i]=r[i]=0;
got[i]=i;
for(int j=0;j<=17;j++)fa[i][j]=0;
}
for(int i=1;i<n;i++){
scanf("%lld%lld%lld",&y[i].a,&y[i].b,&y[i].p);
z[y[i].a].push_back(make_pair(y[i].b,y[i].p));
z[y[i].b].push_back(make_pair(y[i].a,y[i].p));
}
dfs(1,0);
for(int i=1;i<=17;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
for(int i=1;i<=n;i++)z[i].clear();
for(int i=1;i<=q;i++){
scanf("%lld",&num[i]);
check[num[i]]=1;
}
for(int i=1;i<n;i++){
if(!check[i]){
int atop=findd(y[i].a),btop=findd(y[i].b);
got[atop]=btop;
z[y[i].a].push_back(make_pair(y[i].b,y[i].p));
z[y[i].b].push_back(make_pair(y[i].a,y[i].p));
}
}
for(int i=1;i<=n;i++){
int atop=findd(i);
if(!l[atop]){
l[atop]=dfs2(i,0,0).second;
pair<int,int>a=dfs2(l[atop],0,0);
maxx=max(maxx,a.first);
r[atop]=a.second;
}
}
for(int i=q;i>=1;i--){
ans[i]=maxx;
int atop=findd(y[num[i]].a),btop=findd(y[num[i]].b);
got[btop]=atop;
int a=far(l[atop],r[atop]),b=far(l[btop],r[btop]);
int c=far(l[atop],y[num[i]].a)+far(l[btop],y[num[i]].b)+y[num[i]].p;
int d=far(l[atop],y[num[i]].a)+far(r[btop],y[num[i]].b)+y[num[i]].p;
int e=far(r[atop],y[num[i]].a)+far(l[btop],y[num[i]].b)+y[num[i]].p;
int f=far(r[atop],y[num[i]].a)+far(r[btop],y[num[i]].b)+y[num[i]].p;
maxx=max(maxx,max(max(a,b),max(max(c,d),max(e,f))));
if(b>=a&&b>=c&&b>=d&&b>=e&&b>=f){
l[atop]=l[btop];
r[atop]=r[btop];
}
else if(c>=a&&c>=b&&c>=d&&c>=e&&c>=f)r[atop]=l[atop];
else if(d>=a&&d>=b&&d>=c&&d>=e&&d>=f)r[atop]=r[btop];
else if(e>=a&&e>=b&&e>=c&&e>=d&&e>=f)l[atop]=l[btop];
else if(f>=a&&f>=b&&f>=c&&f>=d&&f>=e)l[atop]=r[btop];
}
for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
}
return 0;
}