#include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf32 1000000001 #define Inf64 4000000000000000001 int n; vector> E; vector b; vector> dp; void dfs(int cv,int pv){ vector tdp(2,0); tdp[b[cv]] = 1; rep(i,E[cv].size()){ int to = E[cv][i]; if(to==pv)continue; dfs(to,cv); vector ndp(2,0); rep(j,2){ rep(k,2){ ndp[j^k] += tdp[j] * dp[to][k]; if(k==1){ ndp[j] += tdp[j] * dp[to][k]; } } } swap(tdp,ndp); } dp[cv] = tdp; } int main(){ cin>>n; E.resize(n); rep(i,n-1){ int a,b; cin>>a>>b; a--,b--; E[a].push_back(b); E[b].push_back(a); } mint ans = 0; vector a(n); rep(i,n)cin>>a[i]; b.resize(n); rep(i,30){ rep(j,n)b[j] = (a[j]>>i)&1; dp.assign(n,vector(2,0)); dfs(0,-1); ans += dp[0][1] * mint(2).pow(i); } cout<