#include<bits/stdc++.h>
#define MAXN 250005
#define MAXD 20
#define INTMAX 2147483647
#define int long long
using namespace std;
inline void read(int &n){
int s=0,t=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') t=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=(s<<3)+(s<<1)+(c^48);c=getchar();
}
n=s*t;
}
inline void put(int n){
if(n<0){
putchar('-');n=-n;
}
if(n<10){
putchar(n+48);return;
}
put(n/10);
putchar(n%10+48);
}
struct node{
int v,w,nxt;
}e[MAXN<<1],cl_e[MAXN<<1];
int tot,cl_tot,cnt,top,lg[MAXN],head[MAXN],cl_head[MAXN],dfn[MAXN],dep[MAXN],h[MAXN<<1],fa[MAXN][MAXD],s[MAXN],dp[MAXN],mn[MAXN][MAXD];
bool flag[MAXN];
inline void firstwork(int n){
for(register int i=1;i<=n;++i) lg[i]=lg[i-1]+(i>=(1<<(lg[i-1]+1)));
for(register int i=1;i<=n;++i)
for(register int j=0;j<MAXD;++j) mn[i][j]=INTMAX;
}
inline void add(int u,int v,int w){
++tot;
e[tot].v=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot;
}
inline void cl_add(int u,int v,int w){
++cl_tot;
cl_e[cl_tot].v=v;
cl_e[cl_tot].w=w;
cl_e[cl_tot].nxt=cl_head[u];
cl_head[u]=cl_tot;
}
inline void dfs(int u,int f){
dfn[u]=++cnt;dep[u]=dep[f]+1;fa[u][0]=f;
for(register int i=1;(1<<i)<=dep[u];++i){
fa[u][i]=fa[fa[u][i-1]][i-1];
mn[u][i]=min(mn[u][i-1],mn[fa[u][i-1]][i-1]);
}
for(register int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=f){
mn[v][0]=e[i].w;dfs(v,u);
}
}
}
inline void clear(int n){
cl_tot=0;
for(register int i=1;i<=n;++i) cl_head[i]=0;
for(register int i=1;i<=n;++i) flag[i]=false;
for(register int i=1;i<=n;++i) dp[i]=0;
}
inline bool cmp(int a,int b){
return dfn[a]<dfn[b];
}
inline int LCA(int x,int y){
if(dep[x]>dep[y]) swap(x,y);
while(dep[x]<dep[y]) y=fa[y][lg[dep[y]-dep[x]]];
if(x==y) return x;
int t=lg[dep[x]];
while(t>=0){
if(fa[x][t]!=fa[y][t]){
x=fa[x][t];y=fa[y][t];
}
--t;
}
return fa[x][0];
}
inline int dis(int x,int y){
int ans=INTMAX;
while(dep[x]<dep[y]){
ans=min(ans,mn[y][lg[dep[y]-dep[x]]]);
y=fa[y][lg[dep[y]-dep[x]]];
}
return ans;
}
inline void insert(int u){
int p=s[top],t;
if(u!=p){
t=LCA(u,p);
if(t!=p){
while(dfn[t]<dfn[s[top-1]]){
cl_add(s[top-1],s[top],dis(s[top-1],s[top]));
--top;
}
if(dfn[t]>dfn[s[top-1]]){
cl_add(t,s[top],dis(t,s[top]));s[top]=t;
}
else{
cl_add(t,s[top],dis(t,s[top]));--top;
}
}
}
s[++top]=u;
}
inline void tree_dp(int u){
for(register int i=cl_head[u];i;i=cl_e[i].nxt){
int v=cl_e[i].v;
tree_dp(v);
if(flag[v]) dp[u]+=cl_e[i].w;
else dp[u]+=min(dp[v],cl_e[i].w);
}
}
signed main(){
int n,m,u,v,w,k;
read(n);
firstwork(n);
for(register int i=1;i<n;++i){
read(u);read(v);read(w);
add(u,v,w);add(v,u,w);
}
dfs(1,0);
read(m);
while(m--){
read(k);
clear(n);
for(register int i=1;i<=k;++i){
read(h[i]);flag[h[i]]=true;
}
sort(h+1,h+k+1,cmp);
s[1]=1;top=1;
for(register int i=1;i<=k;++i) insert(h[i]);
while(top>1){
cl_add(s[top-1],s[top],dis(s[top-1],s[top]));--top;
}
tree_dp(1);put(dp[1]);putchar('\n');
}
return 0;
}