#include <bits/stdc++.h>
using namespace std;
set<long long> s;
set<long long>::iterator it;
vector<long long> tree[100005], ans;
int vis[100005] = {0}, vis2[100005] = {0}, init[100005] = {0},
    goal[100005] = {0};
int n;
void dfs(int stx, int state, int tot) {
  vis[stx] = (state ^ 1);
  vis2[stx] = 1;
  int sz = tree[stx].size();
  for (int i = 0; i < sz; i++) {
    int y = tree[stx][i];
    if (vis[y] == 1 || vis2[y] == 1) continue;
    if (state == 1) {
      if (init[y] == goal[y]) {
        if (tot == 0) {
          dfs(y, state ^ 1, tot);
        } else {
          ans.push_back(y);
          dfs(y, state ^ 1, tot ^ 1);
        }
      } else {
        if (tot == 0) {
          ans.push_back(y);
          dfs(y, state ^ 1, tot ^ 1);
        } else {
          dfs(y, state ^ 1, tot);
        }
      }
    } else {
      dfs(y, state ^ 1, tot);
    }
  }
  return;
}
int main() {
  int i, j, t;
  ;
  scanf("%d", &n);
  ;
  for (i = 1; i <= (n - 1); i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    tree[x].push_back(y);
    tree[y].push_back(x);
  }
  for (i = 1; i <= n; i++) {
    scanf("%d", &init[i]);
  }
  for (i = 1; i <= n; i++) scanf("%d", &goal[i]);
  if (init[1] == goal[1]) {
    dfs(1, 0, 0);
  } else {
    ans.push_back(1);
    dfs(1, 0, 1);
  }
  for (i = 0; i < n + 2; i++) vis2[i] = 0, vis[i] = 0;
  int nn = tree[1].size();
  vis[1] = 1;
  for (i = 0; i < nn; i++) {
    int y = tree[1][i];
    if (vis[y] == 0) {
      if (init[y] == goal[y]) {
        dfs(y, 0, 0);
      } else {
        ans.push_back(y);
        dfs(y, 0, 1);
      }
    }
  }
  printf("%d\n", ans.size());
  nn = ans.size();
  for (i = 0; i < nn; i++) printf("%d ", ans[i]);
  return 0;
}
