#pragma comment(linker, "/stack:200000000") #pragma GCC optimize ("Ofast") #pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include using namespace std; #define TRACE #ifdef TRACE #define trace(...) __f(#__VA_ARGS__, __VA_ARGS__) template void __f(const char* name, Arg1&& arg1){ cerr << name << " : " << arg1 << std::endl; } template void __f(const char* names, Arg1&& arg1, Args&&... args){ const char* comma = strchr(names + 1, ',');cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...); } #else #define trace(...) #endif #define rep(i, n) for(int i = 0; i < (n); ++i) #define repA(i, a, n) for(int i = a; i <= (n); ++i) #define repD(i, a, n) for(int i = a; i >= (n); --i) #define trav(a, x) for(auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() #define fill(a) memset(a, 0, sizeof (a)) #define fst first #define snd second #define mp make_pair #define pb push_back typedef long double ld; typedef long long ll; typedef pair pii; typedef vector vi; void pre(){ } const ll mod=1e9+7; vi g[100009]; ll odd[100009],even[100009]; int a[100009],n,x; void dfs(int v,int p){ even[v] = 1; trav(i,g[v]){ if(i!=p){ dfs(i,v); a[v]^=a[i]; tie(even[v],odd[v]) = mp((even[v]*even[i]+odd[v]*odd[i])%mod,(odd[v]*even[i]+odd[i]*even[v])%mod); } } if(x==0){ if(a[v]==0){ tie(odd[v],even[v]) = mp((odd[v]+even[v])%mod,(odd[v]+even[v])%mod); } } else if(a[v]==x){ odd[v] = (odd[v]+even[v])%mod; } else if(a[v]==0){ even[v] = (odd[v]+even[v])%mod; } } int main() { cin.sync_with_stdio(0); cin.tie(0); cin.exceptions(cin.failbit); pre(); cin>>n>>x; rep(i,n) cin>>a[i]; rep(i,n-1){ int u,v;cin>>u>>v;u--,v--; g[u].pb(v); g[v].pb(u); } dfs(0,-1); if(a[0]==0) cout<