#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=Next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}
const int maxn=110;
const int INF=1000000000;
int n,val[maxn],first[maxn],Next[maxn<<1],to[maxn<<1],dis[maxn<<1],e;
void AddEdge(int w,int v,int u) {
    to[++e]=v;dis[e]=w;Next[e]=first[u];first[u]=e;
    to[++e]=u;dis[e]=w;Next[e]=first[v];first[v]=e;
}
int f[maxn][maxn*2][2],A[maxn*2],g[maxn*2][2];
int solve(int x,int fa) {
    ren if(to[i]!=fa) solve(to[i],x);
    f[x][val[x]][0]=f[x][val[x]][1]=0;
    ren if(to[i]!=fa) {
        memcpy(g,f[x],sizeof(g));
        dwn(k,n<<1,0) {
            rep(j,0,k) {
                g[k][0]=min(g[k][0],f[x][k-j][1]+f[to[i]][j][0]+dis[i]);
                g[k][0]=min(g[k][0],f[x][k-j][0]+f[to[i]][j][1]+dis[i]*2);
                g[k][1]=min(g[k][1],f[x][k-j][1]+f[to[i]][j][1]+dis[i]*2);
            }
        }
        memcpy(f[x],g,sizeof(g));
    }
}
int main() {
    n=read();
    rep(i,1,n) val[i]=read();
    rep(i,2,n) AddEdge(read(),read(),read());
    rep(i,1,n) rep(j,0,n<<1) f[i][j][0]=f[i][j][1]=INF;
    solve(1,0);
    rep(i,0,n<<1) A[i]=f[1][i][0];
    dwn(i,(n<<1)-1,0) A[i]=min(A[i],A[i+1]);
    int q=read();
    while(q--) printf("%d\n",upper_bound(A,A+n*2,read())-A-1);
    return 0;
}