#include <bits/stdc++.h>
using namespace std;
const int64_t M = 2e5 + 5;
int64_t n, init[M], goal[M];
vector<int64_t> ans, adj[M];
void dfs(int64_t node, int64_t par, int64_t lvl, int64_t odd, int64_t even) {
  int64_t curr = init[node];
  if (lvl & 1 && odd)
    curr ^= 1;
  else if (lvl % 2 == 0 && even)
    curr ^= 1;
  if (curr != goal[node]) {
    ans.push_back(node);
    if (lvl & 1)
      odd ^= 1;
    else
      even ^= 1;
  }
  for (auto &u : adj[node])
    if (u != par) dfs(u, node, lvl + 1, odd, even);
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int64_t i = 1; i <= n - 1; i++) {
    int64_t u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int64_t i = 1; i <= n; i++) cin >> init[i];
  for (int64_t i = 1; i <= n; i++) cin >> goal[i];
  dfs(1, -1, 0, 0, 0);
  cout << (int64_t)ans.size() << endl;
  for (auto i : ans) cout << i << endl;
  return 0;
}
