#include <bits/stdc++.h> const int MaxN = 100010; const int lim = 10000010; struct edge { int to, next, dis; }; edge e[MaxN << 1]; int query[1010], sum, root, ans, n, m; int cnt, head[MaxN], vis[MaxN], test[lim], ok[lim]; int maxp[MaxN], size[MaxN], dis[MaxN], rem[MaxN], q[MaxN]; inline void add_edge(int u, int v, int d) { ++cnt; e[cnt].to = v; e[cnt].dis = d; e[cnt].next = head[u]; head[u] = cnt; } void getroot(int u, int fa) { size[u] = 1, maxp[u] = 0; for (int i = head[u]; i; i = e[i].next) { int v = e[i].to; if (v == fa || vis[v]) continue; getroot(v, u); size[u] += size[v]; maxp[u] = std::max(maxp[u], size[v]); } maxp[u] = std::max(maxp[u], sum - size[u]); if (maxp[u] < maxp[root]) root = u; } void getdis(int u, int fa) { rem[++rem[0]] = dis[u]; for (int i = head[u]; i; i = e[i].next) { int v = e[i].to; if (v == fa || vis[v]) continue; dis[v] = dis[u] + e[i].dis; getdis(v, u); } } void calc(int u) { int p = 0; for(int i = head[u]; i; i = e[i].next) { int v = e[i].to; if(vis[v]) continue; rem[0] = 0; dis[v] = e[i].dis; getdis(v, u); for(int j = rem[0]; j; --j) for(int k = 1; k <= m; ++k) if(query[k] >= rem[j]) test[k] |= ok[query[k] - rem[j]]; for(int j = rem[0]; j; --j) q[++p] = rem[j], ok[rem[j]] = 1; } for(int i = 1; i <= p; ++i) ok[q[i]] = 0; } void solve(int u) { vis[u] = ok[0] = 1; calc(u); for(int i = head[u]; i; i = e[i].next) { int v = e[i].to; if(vis[v]) continue; sum = size[v]; maxp[root = 0] = lim; getroot(v, 0); solve(root); } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i < n; i++) { int u, v, d; scanf("%d%d%d", &u, &v, &d); add_edge(u, v, d); add_edge(v, u, d); } for(int i = 1; i <= m; i++) scanf("%d", &query[i]); maxp[root] = sum = n; getroot(1, 0); solve(root); for(int i = 1; i <= m; i++) { if(test[i]) printf("AYE "); else printf("NAY "); } return 0; }