#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
using namespace std;
inline void MAX(int &a, int b) {
  if (b > a) a = b;
}
inline void MAX(long long &a, long long b) {
  if (b > a) a = b;
}
int n;
struct edge {
  int nxt, to;
  long long val;
} e[201000 << 1];
int head[201000], ecnt;
inline void addedge(int from, int to, long long val) {
  e[++ecnt] = (edge){head[from], to, val};
  head[from] = ecnt;
}
int que[201000], front, rear;
long long dis[201000], tmp_dis[201000];
inline int bfs(int s) {
  front = rear = 0;
  memset(dis, 0x3f, sizeof(dis));
  que[++rear] = s;
  dis[s] = 0;
  long long mx = 0;
  int mxp = 0;
  while (front < rear) {
    int cur = que[++front];
    if (dis[cur] > mx) mx = dis[cur], mxp = cur;
    for (int i = head[cur]; i; i = e[i].nxt) {
      int to = e[i].to;
      if (dis[to] < 1e17) continue;
      dis[to] = dis[cur] + e[i].val;
      que[++rear] = to;
    }
  }
  return mxp;
}
int fa[201000];
void dfs(int cur, int faa) {
  fa[cur] = faa;
  for (int i = head[cur]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (to == faa) continue;
    dfs(to, cur);
  }
}
int id[201000];
bool cmp(const int x, const int y) { return dis[x] > dis[y]; }
int fath[201000];
int find(int cur) {
  return fath[cur] == cur ? cur : fath[cur] = find(fath[cur]);
}
int ans;
int siz[201000];
bool vis[201000];
inline void add(int cur) {
  siz[cur] = 1;
  vis[cur] = true;
  for (int i = head[cur]; i; i = e[i].nxt) {
    int to = e[i].to;
    if (to == fa[cur]) continue;
    if (vis[to]) fath[to] = cur, siz[cur] += siz[to];
  }
  MAX(ans, siz[cur]);
  if (!vis[fa[cur]]) return;
  int r = find(fa[cur]);
  fath[cur] = r;
  siz[r] += siz[cur];
  MAX(ans, siz[r]);
}
inline void split(int u) {
  siz[u] = 0;
  vis[u] = false;
  if (fa[u] == u) return;
  int r = find(u);
  siz[r]--;
  fath[u] = u;
}
inline void work() {
  for (int i = 1; i <= n; ++i) id[i] = i;
  sort(id + 1, id + 1 + n, cmp);
  int q;
  read(q);
  while (q--) {
    long long l;
    read(l);
    ans = 0;
    memset(vis, 0, sizeof(vis));
    memset(siz, 0, sizeof(siz));
    for (int i = 1; i <= n; ++i) fath[i] = i;
    int ptrl = 1, ptrr = 0;
    while (ptrr < n) {
      ++ptrr;
      int p = id[ptrr];
      while (dis[id[ptrl]] - dis[id[ptrr]] > l) split(id[ptrl]), ++ptrl;
      add(p);
    }
    printf("%d\n", ans);
  }
}
int main() {
  read(n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    long long w;
    read(u), read(v), read(w);
    addedge(u, v, w), addedge(v, u, w);
  }
  int U = bfs(1);
  int V = bfs(U);
  memcpy(tmp_dis, dis, sizeof(dis));
  bfs(V);
  for (int i = 1; i <= n; ++i) MAX(dis[i], tmp_dis[i]);
  int rt = 0;
  long long mn = 1e18;
  for (int i = 1; i <= n; ++i)
    if (dis[i] < mn) mn = dis[i], rt = i;
  dfs(rt, 0);
  work();
  return 0;
}
