#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > adj[100010];
long long d[100010][2], len[100010];
int nxt[100010];
void dfs(int x, int p) {
  d[x][0] = d[x][1] = 0;
  for (int i = 0; i < adj[x].size(); i++) {
    int y = adj[x][i].first, z = adj[x][i].second;
    if (y == p) continue;
    dfs(y, x);
    if (d[y][0] + z > d[x][1]) {
      d[x][1] = d[y][0] + z;
      if (d[x][1] > d[x][0]) swap(d[x][0], d[x][1]), nxt[x] = y;
    }
  }
}
void dfs(int x, int p, long long mx) {
  len[x] = max(d[x][0], mx);
  for (int i = 0; i < adj[x].size(); i++) {
    int y = adj[x][i].first, z = adj[x][i].second;
    if (y == p) continue;
    if (y == nxt[x])
      dfs(y, x, max(mx, d[x][1]) + z);
    else
      dfs(y, x, len[x] + z);
  }
}
int tot, s[100010], f[100010], id[100010];
void DFS(int x, int p) {
  s[x] = ++tot;
  id[tot] = x;
  for (int i = 0; i < adj[x].size(); i++) {
    int y = adj[x][i].first;
    if (y != p) DFS(y, x);
  }
  f[x] = tot;
}
struct LRX {
  struct node {
    int L, R, cnt;
  } p[100010 * 40];
  int tot;
  int modify(int rt, int ps, int l, int r) {
    int cur = ++tot;
    p[cur] = p[rt];
    p[cur].cnt++;
    if (l == r) return cur;
    int mid = l + r >> 1;
    if (ps <= mid)
      p[cur].L = modify(p[rt].L, ps, l, mid);
    else
      p[cur].R = modify(p[rt].R, ps, mid + 1, r);
    return cur;
  }
  int query(int rt, int l, int r, int L, int R) {
    if (L <= l && r <= R) return p[rt].cnt;
    int mid = l + r >> 1;
    int ret = 0;
    if (L <= mid) ret += query(p[rt].L, l, mid, L, R);
    if (mid < R) ret += query(p[rt].R, mid + 1, r, L, R);
    return ret;
  }
  int n, root[100010];
  long long b[100010];
  void build(int _n, long long *a, int *standing) {
    n = _n;
    tot = 0;
    p[0].L = p[0].R = p[0].cnt = 0;
    for (int i = 1; i <= n; i++)
      root[i] = modify(root[i - 1], standing[i], 1, n);
    for (int i = 1; i <= n; i++) b[i] = a[standing[i]];
  }
  int calc(int l, int r, long long x) {
    int ps = lower_bound(b + 1, b + n + 1, x + 1) - b - 1;
    return query(root[ps], 1, n, l, r);
  }
} X;
long long a[100010];
bool cmp(int i, int j) { return a[i] < a[j]; }
int main() {
  int n, q;
  scanf("%d", &n);
  for (int i = 1, x, y, z; i < n; i++) {
    scanf("%d%d%d", &x, &y, &z);
    adj[x].push_back(pair<int, int>(y, z));
    adj[y].push_back(pair<int, int>(x, z));
  }
  dfs(1, 0);
  dfs(1, 0, 0);
  int rt = min_element(len + 1, len + n + 1) - len;
  DFS(rt, 0);
  for (int i = 1; i <= n; i++) a[i] = len[id[i]];
  for (int i = 1; i <= n; i++) id[i] = i;
  sort(id + 1, id + n + 1, cmp);
  X.build(n, a, id);
  scanf("%d", &q);
  while (q--) {
    long long x;
    scanf("%I64d", &x);
    int ans = 0;
    for (int i = 1; i <= n; i++) {
      int cur = X.calc(s[i], f[i], len[i] + x);
      if (ans < cur) ans = cur;
    }
    printf("%d\n", ans);
  }
}
