#include <bits/stdc++.h>
using namespace std;
int edge[200005];
int nex[200005];
int first[200005];
int n, tot;
bool v[100005];
int now[100005], target[100005];
vector<int> ans;
void add(int x, int y) {
  tot++;
  edge[tot] = y;
  nex[tot] = first[x];
  first[x] = tot;
}
void work(int x, int f1, int f2, int layer) {
  v[x] = 1;
  if (layer % 2 == 1 && f1 == 1) now[x] = 1 - now[x];
  if (layer % 2 == 0 && f2 == 1) now[x] = 1 - now[x];
  if (now[x] != target[x]) {
    now[x] = 1 - now[x];
    ans.push_back(x);
    if (layer % 2 == 1)
      f1 = 1 - f1;
    else
      f2 = 1 - f2;
  }
  int i = first[x];
  while (i != 0) {
    if (!v[edge[i]]) {
      work(edge[i], f1, f2, layer + 1);
    }
    i = nex[i];
  }
}
int main() {
  memset(first, 0, sizeof(first));
  memset(v, 0, sizeof(v));
  int i, j, k, l;
  tot = 0;
  scanf("%d", &n);
  for (i = 1; i <= n - 1; i++) {
    scanf("%d%d", &j, &k);
    add(j, k);
    add(k, j);
  }
  for (i = 1; i <= n; i++) scanf("%d", &now[i]);
  for (i = 1; i <= n; i++) scanf("%d", &target[i]);
  work(1, 0, 0, 1);
  sort(ans.begin(), ans.end());
  printf("%d\n", ans.size());
  for (i = 0; i < ans.size(); i++) printf("%d\n", ans[i]);
  return 0;
}
