#include <bits/stdc++.h>   using namespace std;   const long long lim = 100000000000ll;   long long qv[61], dis[100010], ma, nw, dep[100010];   int n, Q, ans[61], x, y, v, hd[100010], cnt, q[100010], l, r, maa, la[100010],       rt[100010];   struct node {     int to, next, val;   } e[200010];   struct seg {     int ls, rs, val;   } t[6000010];   void addedge(int x, int y, int v) {     e[++cnt] = (node){y, hd[x], v}, hd[x] = cnt;     e[++cnt] = (node){x, hd[y], v}, hd[y] = cnt;   }   void add(int i, long long l, long long r, long long x) {     t[i].val++;     if (l == r) return;     long long mid = (l + r) >> 1;     if (x <= mid)       add(t[i].ls ? t[i].ls : (t[i].ls = (++cnt)), l, mid, x);     else       add(t[i].rs ? t[i].rs : (t[i].rs = (++cnt)), mid + 1, r, x);   }   int query(int i, long long l, long long r, long long ql, long long qr) {     if (l == ql && r == qr) return t[i].val;     long long mid = (l + r) >> 1;     if (qr <= mid) return t[i].ls ? query(t[i].ls, l, mid, ql, qr) : 0;     if (ql > mid) return t[i].rs ? query(t[i].rs, mid + 1, r, ql, qr) : 0;     return (t[i].ls ? query(t[i].ls, l, mid, ql, mid) : 0) +            (t[i].rs ? query(t[i].rs, mid + 1, r, mid + 1, qr) : 0);   }   void merge(int i, int I, long long l, long long r) {     t[i].val += t[I].val;     if (l == r) return;     long long mid = (l + r) >> 1;     if (t[i].ls) {       if (t[I].ls) merge(t[i].ls, t[I].ls, l, mid);     } else       t[i].ls = t[I].ls;     if (t[i].rs) {       if (t[I].rs) merge(t[i].rs, t[I].rs, mid + 1, r);     } else       t[i].rs = t[I].rs;   }   void dfs(int x, int fa) {     rt[x] = (++cnt), add(rt[x], 0, lim, dep[x]);     for (int i = hd[x]; i; i = e[i].next)       if (e[i].to != fa) {         if (dep[e[i].to] == -1) dep[e[i].to] = dep[x] + e[i].val;         dfs(e[i].to, x), merge(rt[x], rt[e[i].to], 0, lim);       }     for (int i = 1; i <= Q; i++)       ans[i] = max(ans[i], query(rt[x], 0, lim, dep[x], dep[x] + qv[i]));   }   int main() {     scanf( %d , &n), cnt = 0;     memset(hd, 0, sizeof(hd));     for (int i = 1; i < n; i++) {       scanf( %d%d%d , &x, &y, &v);       addedge(x, y, v);     }     scanf( %d , &Q);     for (int i = 1; i <= Q; i++) scanf( %I64d , &qv[i]), ans[i] = 0;     for (int i = 2; i <= n; i++) dis[i] = -1;     dis[1] = 0, q[l = r = 1] = 1;     while (l <= r) {       x = q[l++];       for (int i = hd[x]; i; i = e[i].next)         if (dis[e[i].to] == -1)           dis[e[i].to] = dis[x] + e[i].val, q[++r] = e[i].to;     }     ma = 0, maa = 0;     for (int i = 1; i <= n; i++)       if (dis[i] > ma) ma = dis[i], maa = i;     for (int i = 1; i <= n; i++) dis[i] = -1;     dis[maa] = 0, q[l = r = 1] = maa;     while (l <= r) {       x = q[l++];       for (int i = hd[x]; i; i = e[i].next)         if (dis[e[i].to] == -1)           dis[e[i].to] = dis[x] + e[i].val, q[++r] = e[i].to,           la[e[i].to] = ((i & 1) ? (i + 1) : (i - 1));     }     ma = 0, maa = 0, nw = 0;     for (int i = 1; i <= n; i++)       if (dis[i] > ma) ma = dis[i], maa = i;     for (int i = 1; i <= n; i++) dep[i] = -1;     while (1) {       nw += e[la[maa]].val;       if ((nw << 1) > ma) {         x = maa, y = e[la[maa]].to;         dep[x] = ma - (nw - e[la[maa]].val);         dep[y] = nw;         break;       }       if ((nw << 1) == ma) {         x = y = e[la[maa]].to;         dep[x] = nw;         break;       }       maa = e[la[maa]].to;     }     cnt = 0;     if (dep[x] < dep[y])       dfs(x, 0);     else       dfs(y, 0);     for (int i = 1; i <= Q; i++) printf( %d n , ans[i]);     return 0;   }