#include <bits/stdc++.h>
using namespace std;
vector<int> tree[100001];
int level[100001], init[100001], goal[100001];
int N;
void DFS(int x) {
  for (int i = 0; i < tree[x].size(); ++i) {
    if (level[tree[x][i]] == 0) {
      level[tree[x][i]] = level[x] + 1;
      DFS(tree[x][i]);
    }
  }
}
int main() {
  int a, b;
  scanf("%d", &N);
  for (int i = 0; i < N - 1; ++i) {
    scanf("%d %d", &a, &b);
    tree[a].push_back(b);
    tree[b].push_back(a);
  }
  for (int i = 1; i <= N; ++i) scanf("%d", &init[i]);
  for (int i = 1; i <= N; ++i) scanf("%d", &goal[i]);
  memset(level, 0, sizeof(level));
  level[1] = 1;
  DFS(1);
  queue<pair<int, pair<int, int> > > Q;
  Q.push(make_pair(1, make_pair(0, 0)));
  int x, y;
  vector<int> ans;
  while (!Q.empty()) {
    a = Q.front().first;
    x = Q.front().second.first;
    y = Q.front().second.second;
    Q.pop();
    if (level[a] % 2) {
      if ((init[a] + x) % 2 != goal[a]) {
        x++;
        ans.push_back(a);
      }
      for (int i = 0; i < tree[a].size(); ++i) {
        if (level[tree[a][i]] == level[a] + 1) {
          Q.push(make_pair(tree[a][i], make_pair(x, y)));
        }
      }
    } else {
      if ((init[a] + y) % 2 != goal[a]) {
        y++;
        ans.push_back(a);
      }
      for (int i = 0; i < tree[a].size(); ++i) {
        if (level[tree[a][i]] == level[a] + 1) {
          Q.push(make_pair(tree[a][i], make_pair(x, y)));
        }
      }
    }
  }
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); ++i) printf("%d\n", ans[i]);
  return 0;
}
