#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
const long long Inf = 10000000000000000ll;
long long R() {
  long long ans = 0, f = 1;
  char c = ' ';
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') f = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) ans = ans * 10 + c - '0';
  return ans * f;
}
int n;
int to[N * 2], ne[N * 2], st[N], sl, w[N * 2];
void Ads(int x, int y, int z) {
  to[++sl] = y;
  ne[sl] = st[x];
  st[x] = sl;
  w[sl] = z;
}
long long d1[N], d2[N], up[N], g[N], L;
int f[N], siz[N], fa[N], In[N], q[N];
bool cmp(int x, int y) { return g[x] < g[y]; }
void dfs1(int u, int ff) {
  d1[u] = 0;
  d2[u] = -Inf;
  for (int i = st[u]; i; i = ne[i])
    if (to[i] != ff) {
      dfs1(to[i], u);
      long long nx = d1[to[i]] + w[i];
      if (nx > d1[u]) swap(nx, d1[u]);
      if (nx > d2[u]) swap(nx, d2[u]);
    }
}
void dfs2(int u, int ff) {
  for (int i = st[u]; i; i = ne[i])
    if (to[i] != ff) {
      up[to[i]] =
          max(up[u], (d1[to[i]] + w[i] == d1[u]) ? d2[u] : d1[u]) + w[i];
      dfs2(to[i], u);
    }
}
int Find(int x) { return (f[x] == x) ? x : (f[x] = Find(f[x])); }
void Merge(int x, int y) {
  int fx = Find(x), fy = Find(y);
  siz[fx] += siz[fy];
  f[fy] = fx;
}
void Work() {
  L = R();
  for (int i = 1; i <= n; ++i) f[i] = i, siz[i] = 1, In[i] = 0;
  int p = n;
  int ans = 0;
  for (int u = n; u >= 1; --u) {
    In[q[u]] = 1;
    for (int i = st[q[u]]; i; i = ne[i])
      if (In[to[i]]) Merge(q[u], to[i]);
    while (g[q[p]] > g[q[u]] + L) {
      --siz[Find(q[p])];
      In[q[p]] = 0;
      --p;
    }
    ans = max(ans, siz[Find(q[u])]);
  }
  cout << ans << '\n';
}
int main() {
  n = R();
  for (int i = 1; i <= n - 1; ++i) {
    int x = R(), y = R(), z = R();
    Ads(x, y, z);
    Ads(y, x, z);
  }
  dfs1(1, 0);
  dfs2(1, 0);
  for (int i = 1; i <= n; ++i) g[i] = max(d1[i], up[i]), q[i] = i;
  sort(q + 1, q + 1 + n, cmp);
  int Q = R();
  while (Q--) Work();
  return 0;
}
