#include <bits/stdc++.h>
using namespace std;

#define mp make_pair
#define pb push_back

typedef long long ll;
typedef pair<int, int> pii;

const int C = 316;
const int MAXN = 100100;
const int MAXM = 2 * MAXN;

int n, m, k, q, sz;
int to[MAXM], cost[MAXM], nxt[MAXM], head[MAXN], E;
vector<int> traverse;
int depth[MAXN];
int inPos[MAXN];
int st[MAXN];
int special[MAXN];
int d[MAXN];
ll res;
int t[18][2 * MAXN];
int Log[2 * MAXN];

void buildST() {
  for (int i = 0; i < 2 * n - 1; ++i)
    t[0][i] = traverse[i];
  for (int j = 1; j < 18; ++j) {
    for (int i = 0; i + (1 << j) - 1 < 2 * n - 1; ++i) {
      if (depth[t[j - 1][i]] < depth[t[j - 1][i + (1 << (j - 1))]])
	t[j][i] = t[j - 1][i];
      else t[j][i] = t[j - 1][i + (1 << (j - 1))];
    }
  }
}

void addEdge(int a, int b, int c) {
  to[E] = b; cost[E] = c; nxt[E] = head[a]; head[a] = E++;
  to[E] = a; cost[E] = c; nxt[E] = head[b]; head[b] = E++;
}

void dfs(int v, int par = 0, int dep = 0, int dst = 0) {
  depth[v] = dep;
  d[v] = dst;
  inPos[v] = traverse.size();
  traverse.pb(v);
  for (int id = head[v]; ~id; id = nxt[id]) {
    if (to[id] != par) {
      dfs(to[id], v, dep + 1, dst + cost[id]);
      traverse.pb(v);
    }
  }
}

int lca(int a, int b) {
  int l = inPos[a];
  int r = inPos[b];
  if (l > r) swap(l, r);
  int L = Log[r - l + 1];
  int lt = t[L][l];
  int rt = t[L][r - (1 << L) + 1];
  if (depth[lt] < depth[rt]) return lt;
  return rt;
}

inline int dist(int a, int b) {
  if (a == b) return 0;
  return d[a] + d[b] - 2 * d[lca(a, b)];
}

int dfs2(int v, int par = 0) {
  int ret = special[v];
  for (int id = head[v]; ~id; id = nxt[id]) {
    if (to[id] != par) {
      int cur = dfs2(to[id], v);
      res += cost[id] * 1ll * cur * (sz - cur);
      ret += cur;
    }
  }
  return ret;
}

int main() {
  memset(head, 0xff, sizeof head);
  Log[1] = 0;
  for (int i = 2; i < 2 * MAXN; ++i)
    Log[i] = Log[i >> 1] + 1;
  scanf("%d%d", &n, &q);
  for (int i = 1, a, b, c; i < n; ++i) {
    scanf("%d%d%d", &a, &b, &c);
    --a; --b;
    addEdge(a, b, c);
  }
  dfs(0);
  buildST();
  while (q --> 0) {
    scanf("%d", &sz);
    for (int i = 0, x; i < sz; ++i) {
      scanf("%d", &x);
      st[i] = --x;
    }
    res = 0;
    if (sz <= C) {
      for (int i = 0; i < sz; ++i) {
        for (int j = i + 1; j < sz; ++j) {
          res += dist(st[i], st[j]);
        }
      }
    } else {
      for (int i = 0; i < sz; ++i) {
	      ++special[st[i]];
      }
      dfs2(0);
      for (int i = 0; i < sz; ++i) {
	     special[st[i]] = 0;
      }
    }
    printf("%lld\n", res);
  }
  return 0;
}