#include using namespace std; const int MX = 1000000, md = 1000000007; vector G[MX]; int a[MX], f[MX], g[MX], x; int dfs(int v, int p = -1) { f[v] = 1; g[v] = 0; int S = a[v]; for (int u : G[v]) { if (u == p) continue; S ^= dfs(u, v); int fv = f[v], gv = g[v]; f[v] = (fv * 1ll * f[u] + gv * 1ll * g[u]) % md; g[v] = (fv * 1ll * g[u] + gv * 1ll * f[u]) % md; } if (p != -1) { int h = (f[v] + g[v]) % md; if (S == x) g[v] = h; if (S == 0) f[v] = h; } return S; } int main() { // freopen("out.txt", "r", stdin); // freopen("rs.txt", "w", stdout); int n; ignore = scanf("%d %d", &n, &x); for (int i = 0; i < n; i++) ignore = scanf("%d", a + i); for (int i = 1, u, v; i < n; i++) { ignore = scanf("%d %d", &u, &v); u--; v--; G[u].emplace_back(v); G[v].emplace_back(u); } int S = dfs(0), ans = 0; if (S == x) ans = (ans + f[0]) % md; if (S == 0) ans = (ans + g[0]) % md; printf("%d\n", ans); return 0; }