#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int deg[N];
int A[N];
vector<int> adj[N];
int n, m;
int dfs(int u, int k, int p = -1) {
// leaf node
if (deg[u] == 1 && p != -1 && k <= m) {
return 1;
}
// more than m consecutive cats on current path
if (k > m) {
return 0;
}
int ret = 0;
for (auto& v : adj[u]) {
if (v == p) continue;
if (A[v]) {
ret += dfs(v, k + 1, u);
} else {
ret += dfs(v, 0, u);
}
}
return ret;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> A[i];
}
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
deg[u]++;
deg[v]++;
adj[u].push_back(v);
adj[v].push_back(u);
}
cout << dfs(1, A[1]) << endl;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDJlNSArIDU7CmludCBkZWdbTl07CmludCBBW05dOwp2ZWN0b3I8aW50PiBhZGpbTl07CmludCBuLCBtOwoKaW50IGRmcyhpbnQgdSwgaW50IGssIGludCBwID0gLTEpIHsKCS8vIGxlYWYgbm9kZQoJaWYgKGRlZ1t1XSA9PSAxICYmIHAgIT0gLTEgJiYgayA8PSBtKSB7CgkJcmV0dXJuIDE7Cgl9CgkKCS8vIG1vcmUgdGhhbiBtIGNvbnNlY3V0aXZlIGNhdHMgb24gY3VycmVudCBwYXRoCglpZiAoayA+IG0pIHsKCQlyZXR1cm4gMDsKCX0KCQoJaW50IHJldCA9IDA7Cglmb3IgKGF1dG8mIHYgOiBhZGpbdV0pIHsKCQlpZiAodiA9PSBwKSBjb250aW51ZTsKCQlpZiAoQVt2XSkgewoJCQlyZXQgKz0gZGZzKHYsIGsgKyAxLCB1KTsKCQl9IGVsc2UgewoJCQlyZXQgKz0gZGZzKHYsIDAsIHUpOwoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCmludCBtYWluKCkgewoJY2luID4+IG4gPj4gbTsKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWNpbiA+PiBBW2ldOwoJfQoJZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CgkJaW50IHUsIHY7CgkJY2luID4+IHUgPj4gdjsKCQlkZWdbdV0rKzsKCQlkZWdbdl0rKzsKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOwoJCWFkalt2XS5wdXNoX2JhY2sodSk7Cgl9CQoJY291dCA8PCBkZnMoMSwgQVsxXSkgPDwgZW5kbDsKfQ==