#include <bits/stdc++.h>
using namespace std;
double PI = acos(-1);
void yes() { cout << "YES\n"; }
void no() { cout << "NO\n"; }
void yesno(long long f) {
  if (f)
    yes();
  else
    no();
}
vector<vector<long long> > tree;
vector<long long> visi, cur, req, lev;
vector<long long> ans;
int ol, el;
void dfs(int node, int level) {
  visi[node] = 1;
  int flag = 0;
  lev[node] = level;
  if (level % 2 == 0) {
    if (el % 2 == 1) cur[node] ^= 1;
  } else {
    if (ol % 2 == 1) cur[node] ^= 1;
  }
  if (cur[node] != req[node]) {
    if (level % 2 == 1) {
      ol++;
    } else
      el++;
    cur[node] ^= 1;
    ans.push_back(node);
    flag = 1;
  }
  for (auto x : tree[node]) {
    if (!visi[x]) {
      dfs(x, level + 1);
    }
  }
  if (flag) {
    if (level % 2 == 1) {
      ol--;
    } else
      el--;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  tree.assign(n + 1, vector<long long>());
  visi.assign(n + 1, 0);
  cur.assign(n + 1, 0);
  req.assign(n + 1, 0);
  lev.assign(n + 1, 0);
  for (long long(i) = (0); (i) < (n - 1); ++(i)) {
    int u, v;
    cin >> u >> v;
    tree[u].push_back(v);
    tree[v].push_back(u);
  }
  for (long long(i) = (1); (i) <= (n); ++(i)) cin >> cur[i];
  for (long long(i) = (1); (i) <= (n); ++(i)) cin >> req[i];
  dfs(1, 1);
  cout << ans.size() << endl;
  for (auto x : ans) cout << x << endl;
}
