#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define ordered_multiset tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update>
#define pb push_back
#define ff first
#define ss second
const int N = 2e5 + 1;
const ll INF = 4e16;
ll readll(){
ll x = 0;
int c = getchar_unlocked();
while(c < '0') c = getchar_unlocked();
while(c >= '0'){
x = x * 10 + (c - '0');
c = getchar_unlocked();
}
return x;
}
vector<pll> graf[N], odl[N];
vi zb;
ll dyst[N];
int podd[N], odw[N];
vector<pair<pll, pll>> pref[N], suf[N];
void poddrzewa(int v, int ojc){
podd[v] = 1;
for(pll x : graf[v]){
int u = x.ff;
if(odw[u] || u == ojc) continue;
poddrzewa(u, v);
podd[v] += podd[u];
}
}
int znajdz(int v, int ojc, int r){
for(pll x : graf[v]){
int u = x.ff;
if(odw[u] || u == ojc) continue;
if(podd[u] > r / 2) return znajdz(u, v, r);
}
return v;
}
void dfs_policz(int v, int ojc){
zb.pb(v);
for(pll x : graf[v]){
int u = x.ff;
if(u == ojc || odw[u]) continue;
dyst[u] = dyst[v] + x.ss;
dfs_policz(u, v);
}
}
void decompose(int v){
poddrzewa(v, 0);
int c = znajdz(v, 0, podd[v]);
odw[c] = 1; dyst[c] = 0;
odl[c].pb({0, c});
for(pll x : graf[c]){
int u = x.ff; ll w = x.ss;
if(odw[u]) continue;
dyst[u] = w;
zb.clear();
dfs_policz(u, 0);
for(int y : zb){
odl[c].pb({dyst[y], u});
}
}
sort(odl[c].begin(), odl[c].end());
int m = odl[c].size();
pref[c].resize(m);
suf[c].resize(m);
pref[c][0] = {{odl[c][0].ff, odl[c][0].ss}, {-1, -2}};
for(int i = 1; i < m; i++){
ll d = odl[c][i].ff, k = odl[c][i].ss;
pref[c][i] = pref[c][i - 1];
if(k == pref[c][i].ff.ss){
pref[c][i].ff.ff = max(pref[c][i].ff.ff, d);
}else{
if(d > pref[c][i].ff.ff){
pref[c][i].ss.ff = pref[c][i].ff.ff;
pref[c][i].ss.ss = pref[c][i].ff.ss;
pref[c][i].ff.ff = d;
pref[c][i].ff.ss = k;
} else if(d > pref[c][i].ss.ff){
pref[c][i].ss.ff = d;
pref[c][i].ss.ss = k;
}
}
}
suf[c][m - 1] = {{odl[c][m - 1].ff, odl[c][m - 1].ss}, {INF, -2}};
for(int i = m - 2; i >= 0; i--){
ll d = odl[c][i].ff, k = odl[c][i].ss;
suf[c][i] = suf[c][i + 1];
if(k == suf[c][i].ff.ss){
suf[c][i].ff.ff = min(suf[c][i].ff.ff, d);
}else{
if(d < suf[c][i].ff.ff){
suf[c][i].ss.ff = suf[c][i].ff.ff;
suf[c][i].ss.ss = suf[c][i].ff.ss;
suf[c][i].ff.ff = d;
suf[c][i].ff.ss = k;
} else if(d < suf[c][i].ss.ff){
suf[c][i].ss.ff = d;
suf[c][i].ss.ss = k;
}
}
}
for(pii x : graf[c]){
if(odw[x.ff]) continue;
decompose(x.ff);
}
}
ll mniej(ll x, int n){
ll best = -1;
for(int c = 1; c <= n; c++){
if(odl[c].size() < 2) continue;
int m = odl[c].size();
int j = m - 1;
for(int i = 0; i < m; i++){
while(j >= 0 && odl[c][i].ff + odl[c][j].ff > x) j--;
if(j < 0) break;
ll kand = odl[c][i].ff, k = odl[c][i].ss;
ll dod = -1;
if(k != pref[c][j].ff.ss){
dod = pref[c][j].ff.ff;
}else if(pref[c][j].ss.ff != -1){
dod = pref[c][j].ss.ff;
}
if(dod != -1){
best = max(kand + dod, best);
}
}
}
return best;
}
ll wiecej(ll x, int n){
ll best = INF;
for(int c = 1; c <= n; c++){
if(odl[c].size() < 2) continue;
int m = odl[c].size();
int j = m - 1;
for(int i = 0; i < m; i++){
while(j > 0 && odl[c][i].ff + odl[c][j - 1].ff >= x) j--;
if(odl[c][i].ff + odl[c][j].ff >= x){
ll kand = odl[c][i].ff, k = odl[c][i].ss;
ll dod = INF;
if(k != suf[c][j].ff.ss){
dod = suf[c][j].ff.ff;
}else if(suf[c][j].ss.ff != INF){
dod = suf[c][j].ss.ff;
}
if(dod != INF){
best = min(kand + dod, best);
}
}
}
}
return best;
}
int main(){
// ios_base::sync_with_stdio(0);
// cin.tie(0);
int n = readll(), q = readll();
for(int i = 1; i < n; i++){
int a = readll(), b = readll(); ll c = readll();
graf[a].pb({b, c});
graf[b].pb({a, c});
}
decompose(1);
vector<pll> przedzialy;
ll pocz = wiecej(1, n);
ll le = (pocz + 1) / 2;
ll akt = pocz;
while(true){
ll best = mniej(2 * akt, n);
if(best > akt){
akt = best;
}else{
przedzialy.pb({le, akt});
ll next = wiecej(2 * akt + 1, n);
if(next == INF) break;
le = (next + 1) / 2;
akt = next;
}
}
while(q--){
ll k = readll();
bool ok = false;
auto it = upper_bound(przedzialy.begin(), przedzialy.end(), make_pair(k, INF));
if(it != przedzialy.begin()){
--it;
if(k >= it->ff && k <= it->ss){
ok = true;
}
}
if(ok) putchar_unlocked('1');
else putchar_unlocked('0');
}
return 0;
}