#include using namespace std; #include using namespace atcoder; using mint = modint998244353; using T = array; T op(const T &a, const T &b) { return T{a[0] * b[0] + a[1] * b[1] + a[0] * b[1], a[0] * b[1] + a[1] * b[0] + a[1] * b[1]}; }; int main() { int N; cin >> N; vector> G(N); for(int _ = 0; _ < N - 1; ++_) { int U, V; cin >> U >> V, --U, --V; G[U].push_back(V); G[V].push_back(U); } vector A(N); for(int i = 0; i < N; ++i) cin >> A[i]; vector B(N); vector dp(N); const auto dfs = [&](auto &&dfs, int v, int par) ->void { dp[v][0] = dp[v][1] = 0, dp[v][B[v]] = 1; for(auto nv : G[v]) if(nv != par) { dfs(dfs, nv, v); dp[v] = op(dp[v], dp[nv]); } }; mint ans = 0; for(int k = 0; k < 30; ++k) { for(int i = 0; i < N; ++i) B[i] = (A[i] >> k & 1); dfs(dfs, 0, -1); ans += dp[0][1] * mint(2).pow(k); } cout << ans.val() << "\n"; }