#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;
}