#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
vector<int> edges[MAXN];
int init[MAXN];
int goal[MAXN];
int flips[MAXN];
int dfs(int now, int parent, int level, int oddFlip, int evenFlip) {
  int currentValue = init[now];
  if ((level % 2 == 0) && evenFlip) {
    currentValue = 1 - currentValue;
  }
  if ((level % 2 == 1) && oddFlip) {
    currentValue = 1 - currentValue;
  }
  int flip = (goal[now] != currentValue);
  flips[now] = flip;
  int ret = flip;
  if (flip && (level % 2 == 0)) evenFlip = 1 - evenFlip;
  if (flip && (level % 2 == 1)) oddFlip = 1 - oddFlip;
  for (int _n = ((int)(edges[now]).size()), i = 0; i < _n; ++i) {
    if (edges[now][i] != parent) {
      ret += dfs(edges[now][i], now, level + 1, oddFlip, evenFlip);
    }
  }
  return ret;
}
int main() {
  int n;
  while (scanf("%d", &n) != EOF) {
    for (int _n = n, i = 0; i < _n; ++i) {
      edges[i].clear();
    }
    for (int _n = n - 1, i = 0; i < _n; ++i) {
      int u, v;
      scanf("%d%d", &u, &v);
      u--;
      v--;
      edges[u].push_back(v);
      edges[v].push_back(u);
    }
    memset(init, 0, sizeof(init));
    memset(goal, 0, sizeof(goal));
    memset(flips, 0, sizeof(flips));
    for (int _n = n, i = 0; i < _n; ++i) {
      scanf("%d", &init[i]);
    }
    for (int _n = n, i = 0; i < _n; ++i) {
      scanf("%d", &goal[i]);
    }
    int ret = dfs(0, -1, 0, 0, 0);
    printf("%d\n", ret);
    for (int _n = n, i = 0; i < _n; ++i) {
      if (flips[i]) printf("%d\n", i + 1);
    }
  }
}
