#include <bits/stdc++.h>
using namespace std;
template <typename T, int maxN>
class Queue {
 private:
  T p[maxN];
  int head, tail;

 public:
  inline Queue() { clear(); }
  inline void clear() { head = tail = 0; }
  inline void push(const T &in) {
    p[tail] = in;
    if (++tail == maxN) tail = 0;
  }
  inline void pop() {
    if (++head == maxN) head = 0;
  }
  inline T &front() { return p[head]; }
  inline bool isEmpty() { return head == tail; }
};
const int MAXV = 100011, MAXE = MAXV * 2;
struct Arc {
  int dest;
  Arc *next;
  inline Arc() { next = NULL; }
  inline Arc(int _dest, Arc *_next) { dest = _dest, next = _next; }
} Npool[MAXE], *Nptr, *adj[MAXV];
inline void insert(int a, int b) {
  adj[a] = new (Nptr++) Arc(b, adj[a]);
  adj[b] = new (Nptr++) Arc(a, adj[b]);
}
int init[MAXV], goal[MAXV], N, fa[MAXV];
bool change[MAXV], operation[MAXV];
Queue<int, MAXV> q;
void bfs() {
  q.clear();
  q.push(1);
  fa[1] = -1;
  memset(change, 0, sizeof(change));
  memset(fa, 0xff, sizeof(fa));
  fa[0] = fa[1] = 0;
  while (!q.isEmpty()) {
    int id = q.front();
    q.pop();
    bool fanzhuan = change[fa[fa[id]]];
    if (init[id] == goal[id] != fanzhuan) {
      operation[id] = false;
      change[id] = fanzhuan;
    } else {
      operation[id] = true;
      change[id] = !fanzhuan;
    }
    for (Arc *p = adj[id]; p; p = p->next) {
      if (fa[p->dest] == -1) {
        fa[p->dest] = id;
        q.push(p->dest);
      }
    }
  }
}
int main() {
  while (scanf("%d", &N) > 0) {
    Nptr = Npool;
    memset(adj, 0, sizeof(adj));
    for (int i = 1; i < N; i++) {
      int a, b;
      scanf("%d%d", &a, &b);
      insert(a, b);
    }
    for (int i = 1; i <= N; i++) scanf("%d", init + i);
    for (int i = 1; i <= N; i++) scanf("%d", goal + i);
    memset(operation, 0, sizeof(operation));
    bfs();
    int count = 0;
    for (int i = 1; i <= N; i++)
      if (operation[i]) count++;
    printf("%d\n", count);
    for (int i = 1; i <= N; i++)
      if (operation[i]) printf("%d\n", i);
  }
  return 0;
}
