#include <bits/stdc++.h>
using namespace std;
const long long M = 1e9 + 7;
const long long N = 1e5;
long long po(long long, long long);
vector<long long> e[N + 5];
long long init[N + 5];
long long goal[N + 5];
vector<long long> ans;
void dfs(long long u, long long par, long long p, long long zero,
         long long one) {
  if (par == 0 && zero) {
    if (zero % 2) {
      init[u] ^= 1;
    }
  }
  if (par == 1 && one) {
    if (one % 2) {
      init[u] ^= 1;
    }
  }
  if (init[u] != goal[u]) {
    init[u] ^= 1;
    if (par == 0)
      zero++;
    else
      one++;
    ans.push_back(u);
  }
  for (auto i : e[u]) {
    if (i != p) {
      dfs(i, par ^ 1, u, zero, one);
    }
  }
}
void solve() {
  long long n;
  cin >> n;
  for (long long i = 0; i < n - 1; i++) {
    long long u, v;
    cin >> u >> v;
    e[u].push_back(v);
    e[v].push_back(u);
  }
  for (long long i = 1; i < n + 1; i++) {
    cin >> init[i];
  }
  for (long long i = 1; i < n + 1; i++) {
    cin >> goal[i];
  }
  dfs(1, 0, 0, 0, 0);
  cout << ans.size() << "\n";
  for (auto i : ans) {
    cout << i << "\n";
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long t = 1;
  for (long long i = 1; i < t + 1; i++) {
    solve();
  }
  return 0;
}
long long po(long long a, long long b) {
  if (b == 0) return 1;
  long long ans = 1;
  if (b % 2 == 0) {
    ans = po(a, b / 2) % M;
    ans = (ans % M * ans % M) % M;
  } else {
    ans = po(a, (b - 1) / 2) % M;
    ans = (ans % M * ans % M * a) % M;
  }
  return ans % M;
}
