#include <bits/stdc++.h>
#define TASK "TREEXOR"
#define int long long
#define MOD 1000000007

using namespace std;

int n, x;
int a[100005], xo[100005], res = 0;
vector <int> adj[100005];

void dfs(int u, int up) {
    xo[u] = a[u];
    for (int v : adj[u]) {
        if (v != up) {
            dfs(v, u);
            xo[u] ^= xo[v];
        }
    }
    if (xo[u] == x) {
        res = (res == 0) ? 1 : res * 2 % MOD;
    }
}

signed main() {
    if (fopen(TASK".inp", "r")) {
        freopen(TASK".inp", "r", stdin);
        freopen(TASK".out", "w", stdout);
    }
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> x;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(1, 0);
    cout << res;
}
