#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,sse3,sse4,popcnt,abm,mmx")
using namespace std;
const int mod = 1e9 + 7;
const int inf_int = INT_MAX;
const long long inf_ll = LLONG_MAX;
const double pi = acos(-1.0);
const double eps = 1e-7;
inline pair<pair<pair<bool, bool>, bool>, string> UseFiles();
inline void get_files() {
  const string file_name = UseFiles().second;
  if (file_name != "") {
    freopen((file_name + ".in").c_str(), "r", stdin);
    freopen((file_name + ".out").c_str(), "w", stdout);
  }
}
vector<int> g[(int)2e5];
bool was[(int)2e5];
vector<int> ans;
int init[(int)2e5], goal[(int)2e5];
int n;
void dfs(int v = 1, int cur1 = 0, int cur2 = 0) {
  was[v] = true;
  if ((init[v] + cur1) % 2 != goal[v]) {
    ans.push_back(v);
    cur1++;
  }
  for (int i = 0; i <= (int)(g[v]).size() - 1; ++i) {
    int to = g[v][i];
    if (!was[to]) dfs(to, cur2, cur1);
  }
}
int main() {
  get_files();
  ios_base ::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  for (int i = 1; i <= n - 1; ++i) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= n; ++i) cin >> init[i];
  for (int i = 1; i <= n; ++i) cin >> goal[i];
  dfs();
  cout << (int)(ans).size() << "\n";
  for (int i = 0; i <= (int)(ans).size() - 1; ++i) cout << ans[i] << '\n';
  return 0;
}
inline pair<pair<pair<bool, bool>, bool>, string> UseFiles() {
  return make_pair(make_pair(make_pair(1, 1), 0), "");
}
