#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > v, syn2;
vector<int> in, out, change, deep;
vector<bool> navs;
void finddeep(int kde, int hlad) {
  deep[kde] = hlad;
  navs[kde] = true;
  for (int i = 0; i < v[kde].size(); i++) {
    if (navs[v[kde][i]]) continue;
    finddeep(v[kde][i], hlad + 1);
  }
  return;
}
void dfs(int kde, int a1, int a2) {
  navs[kde] = true;
  if (deep[kde] % 2 == 0) {
    in[kde] += a1;
  } else
    in[kde] += a2;
  if (in[kde] % 2 != out[kde] % 2) {
    change.push_back(kde);
    if (deep[kde] % 2 == 0)
      a1++;
    else
      a2++;
  }
  for (int i = 0; i < v[kde].size(); i++) {
    if (navs[v[kde][i]]) continue;
    dfs(v[kde][i], a1, a2);
  }
  return;
}
int main() {
  int n, a, b, x;
  cin >> n;
  v.resize(n);
  deep.resize(n);
  navs.resize(n, false);
  for (int i = 0; i < n - 1; i++) {
    cin >> a >> b;
    a--;
    b--;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  for (int i = 0; i < n; i++) {
    cin >> x;
    in.push_back(x);
  }
  for (int i = 0; i < n; i++) {
    cin >> x;
    out.push_back(x);
  }
  finddeep(0, 0);
  navs.resize(0, false);
  navs.resize(n, false);
  dfs(0, 0, 0);
  cout << change.size() << endl;
  for (int i = 0; i < change.size(); i++) cout << change[i] + 1 << endl;
  return 0;
}
