#include <bits/stdc++.h>
using namespace std;
int get() {
  char c;
  while (c = getchar(), (c < '0' || c > '9') && (c != '-'))
    ;
  bool flag = (c == '-');
  if (flag) c = getchar();
  int x = 0;
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - 48;
    c = getchar();
  }
  return flag ? -x : x;
}
void output(int x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  int len = 0, data[10];
  while (x) {
    data[len++] = x % 10;
    x /= 10;
  }
  if (!len) data[len++] = 0;
  while (len--) putchar(data[len] + 48);
  putchar('\n');
}
vector<int> g[100000], ans;
bool a[100000], b[100000];
void dfs(int x, int last, int d, bool s0, bool s1) {
  bool current = a[x];
  if (d & 1)
    current ^= s1;
  else
    current ^= s0;
  if (current != b[x]) {
    ans.push_back(x + 1);
    if (d & 1)
      s1 ^= 1;
    else
      s0 ^= 1;
  }
  for (int i = 0; i < g[x].size(); i++)
    if (g[x][i] != last) dfs(g[x][i], x, d + 1, s0, s1);
}
int main() {
  int n = get();
  for (int i = 1; i < n; i++) {
    int x = get() - 1, y = get() - 1;
    g[x].push_back(y);
    g[y].push_back(x);
  }
  for (int i = 0; i < n; i++) a[i] = get();
  for (int i = 0; i < n; i++) b[i] = get();
  dfs(0, -1, 0, 0, 0);
  output(ans.size());
  for (int i = 0; i < ans.size(); i++) output(ans[i]);
  return 0;
}
