#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > AL;
vector<int> d, dfs_num;
int init[100005], goal[100005];
vector<int> ans;
int cost = 0;
void dfs(int u, int even, int odd) {
  dfs_num[u] = 1;
  if (d[u] % 2 == 1) {
    if ((odd % 2 && init[u] == goal[u]) ||
        (odd % 2 == 0 && init[u] != goal[u])) {
      ans.push_back(u);
      cost++;
      for (auto &v : AL[u]) {
        if (dfs_num[v] == -1) {
          dfs(v, even, odd + 1);
        }
      }
    } else {
      for (auto &v : AL[u]) {
        if (dfs_num[v] == -1) {
          dfs(v, even, odd);
        }
      }
    }
  } else {
    if ((even % 2 && init[u] == goal[u]) ||
        (even % 2 == 0 && init[u] != goal[u])) {
      ans.push_back(u);
      cost++;
      for (auto &v : AL[u]) {
        if (dfs_num[v] == -1) {
          dfs(v, even + 1, odd);
        }
      }
    } else {
      for (auto &v : AL[u]) {
        if (dfs_num[v] == -1) {
          dfs(v, even, odd);
        }
      }
    }
  }
}
int main() {
  int n;
  scanf("%d", &n);
  AL.assign(n + 1, vector<int>());
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    AL[u].emplace_back(v);
    AL[v].emplace_back(u);
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &init[i]);
  }
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &goal[i]);
  }
  d.assign(n + 1, 1000000);
  d[1] = 1;
  queue<int> q;
  q.push(1);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (auto &v : AL[u]) {
      if (d[v] == 1000000) {
        d[v] = d[u] + 1;
        q.push(v);
      }
    }
  }
  dfs_num.assign(n + 1, -1);
  dfs(1, 0, 0);
  printf("%d\n", cost);
  for (auto &p : ans) {
    printf("%d\n", p);
  }
}
