中工业
#include<bits/stdc++.h>
#define F(i0,i1,i2) for(int i0=(i1);i0<=(i2);++i0)
#define int long long
#define pii pair<int,int>
#define fr first
#define sc second
using namespace std;
inline int rd(){
int f=0,x=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
return f?-x:x;
}
const int N=1e7+7,inf=1e7;
struct Id{int v,w,nt;}e[N<<1];
int p[N],id=1;
void add(int x,int y,int z){e[++id]={y,z,p[x]};p[x]=id;}
int qe[N];
int n,m;
int vis[N];
int mxp[N],siz[N],rt,sum;//sum是当前处理范围的树大小
void getrt(int x,int ffa){
siz[x]=1,mxp[x]=0;
for(int i=p[x];i;i=e[i].nt){
int v=e[i].v;
if(v==ffa||vis[v])continue;
getrt(v,x);
siz[x]+=siz[v];
mxp[x]=max(siz[v],mxp[x]);
}
mxp[x]=max(sum-siz[x],mxp[x]);
if(mxp[x]<mxp[rt])rt=x;
}
int jud[N];//某长度的路径是否存在
int rem[N];//rem[0]->rem的长度 处理出来到根的距离
int dis[N];
void getdis(int x,int ffa){
rem[++rem[0]]=dis[x];
for(int i=p[x];i;i=e[i].nt){
int v=e[i].v;
if(v==ffa||vis[v])continue;
dis[v]=dis[x]+e[i].w;
getdis(v,x);
}
}
int test[N];
int q[N];
void calc(int x){
int ql=0;
for(int i=p[x];i;i=e[i].nt){
int v=e[i].v;
if(vis[v])continue;
rem[0]=0;
dis[v]=e[i].w;
getdis(v,x);
for(int j=rem[0];j;--j)
for(int k=1;k<=m;++k)
if(qe[k]>=rem[j])
test[k]|=jud[qe[k]-rem[j]];
for(int j=rem[0];j;--j)
q[++ql]=rem[j],jud[rem[j]]=1;
}
F(i,1,ql)jud[q[i]]=0;
}
void solve(int x){
jud[0]=vis[x]=1;
calc(x);
for(int i=p[x];i;i=e[i].nt){
int v=e[i].v;
if(vis[v])continue;
sum=siz[v];mxp[rt=0]=inf;
getrt(v,0);
solve(rt);
}
}
signed main(){
n=rd(),m=rd();
F(i,1,n-1){
int x=rd(),y=rd(),z=rd();
add(x,y,z);
add(y,x,z);
}
F(i,1,m)qe[i]=rd();
mxp[rt]=sum=n;
getrt(1,0);
solve(rt);
F(i,1,m){
if(test[i])puts("AYE");
else puts("NAY");
}
return 0;
}