#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> vec[100005];
bool visited[100005];
vector<int> result;
int arr[100005];
int goal[100005];
void dfs(int node, bool even, bool odd, int level) {
  visited[node] = true;
  if ((level % 2 == 0 && even) || (level % 2 == 1 && odd))
    arr[node] = !arr[node];
  if (arr[node] != goal[node]) {
    result.push_back(node);
    if (level % 2 == 0)
      even = !even;
    else
      odd = !odd;
  }
  int vSize = vec[node].size();
  for (int counter = 0; counter < vSize; counter++)
    if (!visited[vec[node][counter]])
      dfs(vec[node][counter], even, odd, level + 1);
}
int main() {
  cin >> n;
  for (int counter = 0; counter < n - 1; counter++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    vec[x].push_back(y);
    vec[y].push_back(x);
  }
  for (int counter = 0; counter < n; counter++) cin >> arr[counter];
  for (int counter = 0; counter < n; counter++) cin >> goal[counter];
  dfs(0, false, false, 0);
  int vSize = result.size();
  cout << vSize << endl;
  for (int counter = 0; counter < vSize; counter++)
    cout << result[counter] + 1 << endl;
  return 0;
}
