#include <bits/stdc++.h>
using namespace std;
long long int C(long long int n, long long int r) {
  if (r > n - r) r = n - r;
  long long int ans = 1;
  for (long long int i = 1; i <= r; i++) {
    ans *= (n - r + i);
    ans /= i;
  }
  return ans;
}
long long int stringtointer(string a) { return stoi(a); }
long long int countdigit(long long int a) {
  long long int ans = 0;
  while (a) {
    a /= 10;
    ans++;
  }
  return ans;
}
long long int factorial(long long int n) {
  return (n == 1 || n == 0) ? 1 : n * factorial(n - 1);
}
long long int dayofweek(long long int d, long long int m, long long int y) {
  static long long int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  y -= m < 3;
  return (y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7;
}
long long int floorSqrt(long long int x) {
  if (x == 0 || x == 1) return x;
  long long int start = 1, end = x, ans;
  while (start <= end) {
    long long int mid = (start + end) / 2;
    if (mid * mid == x) return mid;
    if (mid * mid < x) {
      start = mid + 1;
      ans = mid;
    } else
      end = mid - 1;
  }
  return ans;
}
vector<long long int> graph[100002];
long long int parent[100002];
long long int arr[100002];
long long int brr[100002];
bool visited[100002];
void dfs(long long int si, long long int p) {
  for (auto i : graph[si]) {
    if (i == p) continue;
    parent[i] = si;
    dfs(i, si);
  }
}
void dfs2(long long int si, vector<long long int>& output, long long int p) {
  if (arr[si] != brr[si]) {
    long long int a = parent[si];
    long long int b = parent[a];
    if (!visited[b]) {
      output.push_back(si);
      visited[si] = true;
    } else {
      visited[si] = true;
    }
  } else {
    long long int a = parent[si];
    long long int b = parent[a];
    if (visited[b]) {
      visited[si] = false;
      output.push_back(si);
    }
  }
  for (auto i : graph[si]) {
    if (i == p) continue;
    dfs2(i, output, si);
  }
}
void solve() {
  long long int n;
  cin >> n;
  for (long long int i = 0; i < n - 1; i++) {
    long long int a, b;
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  for (long long int i = 1; i <= n; i++) cin >> arr[i];
  for (long long int i = 1; i <= n; i++) cin >> brr[i];
  parent[1] = 0;
  dfs(1, 0);
  memset(visited, false, sizeof(visited));
  vector<long long int> output;
  parent[0] = 0;
  dfs2(1, output, 0);
  long long int z = output.size();
  cout << z << endl;
  for (long long int i = 0; i < z; i++) {
    cout << output[i] << endl;
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
