#include <bits/stdc++.h>
using namespace std;
int n, m, u, v;
int maxval = 200004;
int init[200005], goal[200005], lev[200005], beg[200005], out[200005];
int bit[2][200005] = {0};
bool vis[200005];
vector<vector<int> > g;
set<int> st;
void update(int l, int idx, int val) {
  for (; idx <= maxval; idx += (idx & -idx)) {
    bit[l][idx] += val;
  }
}
int getsum(int l, int idx) {
  int sum = 0;
  for (; idx; idx -= (idx & -idx)) {
    sum += bit[l][idx];
  }
  return sum;
}
void dfs(int u, int level) {
  static int timer = 0;
  vis[u] = true;
  beg[u] = out[u] = ++timer;
  lev[u] = level;
  vector<int> &h = g[u];
  for (int i = 0; i < h.size(); i++)
    if (not vis[h[i]]) dfs(h[i], level + 1);
  out[u] = timer;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  g.resize(n + 1);
  for (int i = 0; i < n - 1; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) cin >> init[i];
  for (int i = 1; i <= n; i++) cin >> goal[i];
  dfs(1, 1);
  queue<int> q;
  fill(vis, vis + n + 1, false);
  q.push(1);
  vis[1] = true;
  while (not q.empty()) {
    u = q.front();
    q.pop();
    vector<int> &h = g[u];
    for (int i = 0; i < h.size(); i++)
      if (not vis[h[i]]) {
        vis[h[i]] = true;
        q.push(h[i]);
      }
    int num = getsum(lev[u] % 2, beg[u]);
    if (num > 0 and num & 1) init[u] = !init[u];
    if (init[u] != goal[u]) {
      st.insert(u);
      update(lev[u] % 2, beg[u], 1);
      update(lev[u] % 2, out[u] + 1, -1);
    }
  }
  cout << st.size() << "\n";
  for (auto it : st) cout << it << "\n";
  return 0;
}
