#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/stack:200000000")
int t, n, m, j, ans, k, a, b, c, d, e, f, sum, i, sz, row, col, l, mx, num;
string s, s2, s3, s4;
vector<int> graph[(int)(1e6 + 10)];
vector<int> v;
bool visited[(int)(1e6 + 10)];
int ar[(int)(1e6 + 10)], ar2[(int)(1e6 + 10)], level[(int)(1e6 + 10)];
void brainfuck();
void dfs(int node, int even, int odd);
int main() {
  ios_base::sync_with_stdio(NULL);
  cin.tie(NULL);
  cout.tie(NULL);
  brainfuck();
  return 0;
}
void brainfuck() {
  cin >> n;
  for (i = 1; i < n; i++) {
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  for (i = 1; i <= n; i++) {
    cin >> ar[i];
  }
  for (i = 1; i <= n; i++) {
    cin >> a;
    if (ar[i] != a)
      ar[i] = 1;
    else
      ar[i] = 0;
  }
  dfs(1, 0, 0);
  cout << v.size() << "\n";
  for (i = 0; i < v.size(); i++) cout << v[i] << "\n";
}
void dfs(int node, int even, int odd) {
  visited[node] = 1;
  if (level[node] % 2 == 0) {
    if (even && !ar[node]) {
      even = 0;
      v.push_back(node);
    } else if (!even && ar[node]) {
      even = 1;
      v.push_back(node);
    }
  } else {
    if (odd && !ar[node]) {
      odd = 0;
      v.push_back(node);
    } else if (!odd && ar[node]) {
      odd = 1;
      v.push_back(node);
    }
  }
  int szz = graph[node].size();
  for (int ii = 0; ii < szz; ii++) {
    int aa = graph[node][ii];
    if (!visited[aa]) {
      level[aa] = level[node] + 1;
      dfs(aa, even, odd);
    }
  }
}
