#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;
const int mod=1000007;
int n,m,maxk;
struct Edge{
int to,nxt,val;
}edge[MAXN<<1];
int head[MAXN],edge_cnt;
int tree_size[MAXN];
bool removed[MAXN];
int hash_head[2][mod+10],hash_val[2][MAXN],hash_nxt[2][MAXN];
int hash_cnt[2];
int stack_top[2],hash_stack[2][MAXN];
int query[110];
bool query_ans[110];
inline void insert_hash(int val,int ty){
int h=val%mod;
for(int i=hash_head[ty][h];i;i=hash_nxt[ty][i]){
if(hash_val[ty][i]==val) return;
}
int hnt=++hash_cnt[ty];
hash_val[ty][hnt]=val;
hash_nxt[ty][hnt]=hash_head[ty][h];
if(!hash_head[ty][h]){
int snt=stack_top[ty]++;
hash_stack[ty][snt]=h;
}
hash_head[ty][h]=hnt;
}
inline bool exist_in_hash(int val){
int h=val%mod;
for(int i=hash_head[0][h];i;i=hash_nxt[0][i]){
if(hash_val[0][i]==val) return true;
}
return false;
}
inline void add_edge(int a,int b,int w){
edge[++edge_cnt].nxt=head[a];
head[a]=edge_cnt;
edge[edge_cnt].to=b;
edge[edge_cnt].val=w;
}
void calculate_tree_size(int u,int fa){
tree_size[u]=1;
for(int i=head[u],v;i;i=edge[i].nxt){
v=edge[i].to;
if(v==fa||removed[v]) continue;
calculate_tree_size(v,u);
tree_size[u]+=tree_size[v];
}
}
int find_heavy(int u,int fa,int max_size){
while(1){
bool ok=true;
for(int i=head[u],v;i;i=edge[i].nxt){
v=edge[i].to;
if(v==fa||removed[v])continue;
if(tree_size[v]>=max_size){
ok=false;
fa=u;
u=v;
break;
}
}
if(ok) return u;
}
}
void collect_dist_ans(int u,int fa,int dist,vector<int>& dist_list){
if(dist>maxk) return;
dist_list.push_back(dist);
for(int v,e=head[u];e;e=edge[e].nxt){
v=edge[e].to;
if(v==fa||removed[v])continue;
collect_dist_ans(v,u,dist+edge[e].val,dist_list);
}
}
void solve(int x){
calculate_tree_size(x,0);
int heavy=find_heavy(x,0,tree_size[x]/2);
for(int i=1;i<=stack_top[0];++i)hash_head[0][hash_stack[0][i]]=0;
stack_top[0]=0;hash_cnt[0]=0;
insert_hash(0,0);
for(int v,e=head[heavy];e;e=edge[e].nxt){
v=edge[e].to;
if(removed[v])continue;
for (int i = 1; i <= stack_top[1]; i++) hash_head[1][hash_stack[1][i]] = 0;
stack_top[1] = 0; hash_cnt[1] = 0;
vector<int> dist_list;
collect_dist_ans(v,heavy,edge[e].val,dist_list);
for(int d:dist_list){
for(int qi=1;qi<=m;qi++){
if(query_ans[qi])continue;
if(d==query[qi])query_ans[qi]=true;
else if(d<query[qi]&&exist_in_hash(query[qi]-d)){
query_ans[qi]=true;
}
}
}
for(int d:dist_list)insert_hash(d,0);
}
removed[heavy]=true;
for(int v,e=head[heavy];e;e=edge[e].nxt){
v=edge[e].to;
if(!removed[v]) solve(v);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int u,v,w,i=1;i<n;++i){
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
for(int i=1;i<=m;++i){
scanf("%d",&query[i]);
maxk=max(query[i],maxk);
}
solve(1);
for(int i=1;i<=m;++i){
if(query_ans[i]) puts("AYE");
else puts("NAY");
}
return 0;
}