#include <bits/stdc++.h>
using namespace std;
const int Maxn = 100020;
int n;
int f[Maxn];
long long h1[Maxn], h2[Maxn];
int sz[Maxn], fa[Maxn];
vector<pair<long long, int> > G[Maxn];
void dfs(int u, int p) {
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i].first;
    if (v == p) continue;
    dfs(v, u);
    long long w = h1[v] + G[u][i].second;
    if (w > h1[u]) {
      h2[u] = h1[u];
      h1[u] = w;
      continue;
    }
    if (w > h2[u]) {
      h2[u] = w;
      continue;
    }
  }
}
void dfs2(int u, int p) {
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i].first;
    if (v == p) continue;
    long long w = G[u][i].second;
    long long t = ((w + h1[v]) == h1[u]) ? (h2[u] + w) : (h1[u] + w);
    if (t > h1[v]) {
      h2[v] = h1[v];
      h1[v] = t;
    } else if (t > h2[v]) {
      h2[v] = t;
    }
    dfs2(v, u);
  }
}
vector<pair<long long, int> > V;
int find(int x) {
  int ret = x;
  for (; fa[ret] != ret; ret = fa[ret])
    ;
  for (int i; x != ret;) {
    i = fa[x];
    fa[x] = ret;
    x = i;
  }
  return ret;
}
void dfs3(int u, int p) {
  f[u] = p;
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i].first;
    if (v == p) continue;
    dfs3(v, u);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    G[u].push_back(pair<long long, int>(v, w));
    G[v].push_back(pair<long long, int>(u, w));
  }
  if (n == 2) {
    int q;
    scanf("%d", &q);
    while (q--) {
      int x;
      scanf("%d", &x);
      puts("2");
    }
    return 0;
  }
  int rt = 1;
  for (int i = 1; i <= n; i++)
    if (G[i].size() > 1) rt = i;
  dfs(rt, 0);
  dfs2(rt, 0);
  for (int i = 1; i <= n; i++) V.push_back(pair<long long, int>(h1[i], i));
  sort(V.begin(), V.end());
  rt = V[0].second;
  dfs3(rt, 0);
  int m;
  scanf("%d", &m);
  while (m--) {
    for (int i = 1; i <= n; i++) fa[i] = i, sz[i] = 1;
    long long x;
    scanf("%I64d", &x);
    int j = n - 1, ans = 0;
    for (int i = n - 1; i >= 0; i--) {
      int cur = V[i].second;
      for (int k = 0; k < G[cur].size(); k++) {
        int v = G[cur][k].first;
        if (v == f[cur]) continue;
        int t1 = find(cur), t2 = find(v);
        if (t1 != t2) {
          sz[t1] += sz[t2];
          fa[t2] = t1;
        }
      }
      while (V[j].first - V[i].first > x) {
        sz[find(V[j].second)]--;
        j--;
      }
      ans = max(ans, sz[find(cur)]);
    }
    printf("%d\n", ans);
  }
}
