TLE1个点
#include<bits/stdc++.h>
using namespace std;
const int N=2.5e5+10;
struct Graph{
int cnt,hd[N],to[N<<1],wt[N<<1],nt[N<<1];
void add(int u,int v,int w){
to[++cnt]=v,wt[cnt]=w,nt[cnt]=hd[u],hd[u]=cnt;
}
}t,vt;
int cnt,dfn[N],fa[N],dep[N],sz[N],son[N],top[N],a[N];
void dfs(int u){
for(int e=t.hd[u];e;e=t.nt[e]){
int v=t.to[e];
if(v==fa[u])continue;
a[v]=min(a[u],t.wt[e]);
fa[v]=u,dep[v]=dep[u]+1;
dfs(v),sz[u]+=sz[v];
if(sz[v]>sz[son[u]])son[u]=v;
}
}
void init(int u){
dfn[u]=++cnt;
if(son[u]){
int v=son[u];
top[v]=top[u],init(v);
}
for(int e=t.hd[u];e;e=t.nt[e]){
int v=t.to[e];
if(dfn[v])continue;
top[v]=v,init(v);
}
}
int lca(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]>dep[top[v]])u=fa[top[u]];
else v=fa[top[v]];
}
return dep[u]<dep[v]?u:v;
}
int h[N],h1[N<<1];
bitset<N>tag;
bool cmp(int x,int y){
return dfn[x]<dfn[y];
}
void build_vt(int n){
vt.cnt=0;
sort(h+1,h+n+1,cmp);
int m=0;
for(int i=1;i<n;++i){
h1[++m]=h[i],vt.hd[h1[m]]=0;
h1[++m]=lca(h[i],h[i+1]),vt.hd[h1[m]]=0;
}
h1[++m]=h[n],vt.hd[h1[m]]=0;
sort(h1+1,h1+m+1,cmp);
m=unique(h1+1,h1+m+1)-h1-1;
for(int i=1;i<m;++i){
vt.add(lca(h1[i],h1[i+1]),h1[i+1],0);
}
}
long long solve(int u){
long long ans=0;
for(int e=vt.hd[u];e;e=vt.nt[e]){
int v=vt.to[e];
if(v==fa[u])continue;
if(tag[v])ans+=a[v];
else ans+=min(solve(v),(long long)a[v]);
}
return ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=1;i<n;++i){
int u,v,w;
cin>>u>>v>>w;
t.add(u,v,w),t.add(v,u,w);
}
a[1]=114514,dfs(1),init(1);
int m;cin>>m;
while(m--){
int k;
cin>>k;
for(int i=1;i<=k;++i){
cin>>h[i],tag[h[i]]=1;
}
h[++k]=1,build_vt(k);
cout<<solve(1)<<endl;
for(int i=1;i<=k;++i){
tag[h[i]]=0;
}
}
return 0;
}