#include <bits/stdc++.h>
using namespace std;
template <class T>
T gi() {
  T x = 0;
  bool f = 0;
  char c = getchar();
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  if (c == '-') f = 1, c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return f ? -x : x;
}
const int N = 1e5 + 10;
int son[N], siz[N], fa[N], top[N];
long long dep[N], f[N];
vector<pair<int, int> > e[N];
void dfs1(int u, int ff) {
  siz[u] = 1;
  fa[u] = ff;
  for (auto v : e[u])
    if (v.first != ff) {
      dep[v.first] = dep[u] + v.second;
      dfs1(v.first, u), siz[u] += siz[v.first];
      if (siz[son[u]] < siz[v.first]) son[u] = v.first;
    }
}
void dfs2(int u, int tf) {
  top[u] = tf;
  if (!son[u]) return;
  dfs2(son[u], tf);
  for (auto v : e[u])
    if (v.first != fa[u] && v.first != son[u]) dfs2(v.first, v.first);
}
long long dis(int x, int y) {
  long long res = dep[x] + dep[y];
  while (top[x] != top[y]) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    x = fa[top[x]];
  }
  return res - 2 * min(dep[x], dep[y]);
}
int p[N], n, Fa[N], Siz[N];
bool cmp(int x, int y) { return f[x] > f[y]; }
int nowans;
bool flg[N];
int find(int x) { return Fa[x] == x ? x : Fa[x] = find(Fa[x]); }
void ins(int x) {
  flg[x] = 1;
  for (auto v : e[x])
    if (flg[v.first]) {
      int z = find(v.first);
      Siz[z] += Siz[find(x)];
      Fa[find(x)] = z;
    }
  nowans = max(nowans, Siz[find(x)]);
}
void del(int x) {
  int t = find(x);
  Siz[t]--;
  flg[x] = 0;
}
int solve(long long l) {
  nowans = 1;
  for (int i = 1; i <= n; i++) Fa[i] = i, Siz[i] = 1;
  for (int i = 1, pp = 1; i <= n; i++) {
    while (pp <= n && f[p[i]] - f[p[pp]] <= l) ins(p[pp++]);
    del(p[i]);
  }
  return nowans;
}
int main() {
  n = gi<int>();
  for (int i = 1; i < n; i++) {
    int x = gi<int>(), y = gi<int>(), z = gi<int>();
    e[x].push_back(make_pair(y, z));
    e[y].push_back(make_pair(x, z));
  }
  dfs1(1, 0);
  dfs2(1, 1);
  long long mxlen = 0;
  int p1, p2;
  for (int i = 1; i <= n; i++) {
    long long len = dis(1, i);
    if (len > mxlen) mxlen = len, p1 = i;
  }
  mxlen = 0;
  for (int i = 1; i <= n; i++) {
    long long len = dis(p1, i);
    if (len > mxlen) mxlen = len, p2 = i;
  }
  for (int i = 1; i <= n; i++) f[i] = max(dis(p1, i), dis(p2, i));
  for (int i = 1; i <= n; i++) p[i] = i;
  sort(p + 1, p + 1 + n, cmp);
  int Q = gi<int>();
  while (Q--) printf("%d\n", solve(gi<long long>()));
  return 0;
}
