#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <cassert>
#include <cmath>
using namespace std;

int main() {
        int n;
        scanf("%d", &n);
        vector<vector<int>> g(n);
        vector<int> par(n);
        for (int i = 1; i < n; i ++) {
                int p;
                scanf("%d", &p);
                g[p].push_back(i);
                par[i] = p;
        }
        vector<int> a(n);
        for (int i = 0; i < n; i ++) {
                scanf("%d", &a[i]);
        }
        vector<int> color(n, 0); //2:need to complete, 1:determined, 0:no considering, -1:dead
        vector<int> ans;
        for (;;) {
                if (color[0] == -1) break;
                vector<bool> path(n);
                function<void (int)> check_path = [&](int u) {
                        path[u] = true;
                        int cnt = 0;
                        for (auto v : g[u]) if (color[v] != -1) {
                                cnt ++;
                                check_path(v);
                                path[u] = path[u] && path[v];
                        }
                        if (cnt > 1) path[u] = false;
                };
                check_path(0);
                set<int> paths;
                for (int i = 0; i < n; i ++) {
                        if (path[i]) {
                                paths.insert(i);
                        }
                }
                for (int i = 0; i < n; i ++) {
                        if (paths.count(a[i])) {
                                color[i] = 2;
                        }
                }
                /*
                cerr << "color first" << endl;
                for (int i = 0; i < n; i ++) cerr << color[i] << endl;
                */
                function<int (int)> find_bottom = [&](int u) {
                        assert(path[u]);
                        for (auto v : g[u]) if (color[v] != -1) {
                                return find_bottom(v);
                        }
                        return u;
                };
                function<void (int, int, int)> insert = [&](int u, int val, int col) {
                        int tmpa = a[u];
                        int tmpc = color[u];
                        a[u] = val;
                        color[u] = col;
                        if (u != 0) insert(par[u], tmpa, tmpc);
                };
                function<bool (int, int, int)> compare = [&](int pos, int in_num, int cur_num) {
                        while (true) {
                                if (pos == in_num) {
                                        return false;
                                } else if (pos == cur_num) {
                                        return true;
                                }
                                if (pos == 0) {
                                        break;
                                }
                                pos = par[pos];
                        }
                        return false;
                };
                vector<int> depth(n);
                function<void (int, int)> get_depth = [&](int u, int d) {
                        depth[u] = d;
                        for (auto v : g[u]) if (color[v] != -1) {
                                get_depth(v, d + 1);
                        }
                };
                while (true) {
                        bool ok = true;
                        for (int i = 0; i < n; i ++) {
                                ok = ok && a[i] == i;
                        }
                        if (ok) { 
                                break;
                        }
                        if (color[0] == 2) {
                                //if (a[0] == 0) break;
                                int target = a[0];
                                int cur = find_bottom(target);
                                /*
                                while (!(color[cur] != 1 || find_above(par[cur], a[cur]))) {
                                        cur = par[cur];
                                }
                                */
                                while (color[cur] == 1 && compare(cur, target, a[cur])) {
                                        cur = par[cur];
                                }
                                /*
                                cerr << "final cur " << cur << endl;
                                cerr << "color : a" << endl;
                                for (int i = 0; i < n; i ++) cerr << color[i] << " : " << a[i] << endl;
                                cerr << "insert" << endl;
                                */
                                insert(cur, target, 1);
                                /*
                                cerr << "color : a" << endl;
                                for (int i = 0; i < n; i ++) cerr << color[i] << " : " << a[i] << endl;
                                */
                                ans.push_back(cur);
                        } else {
                                get_depth(0, 0);
                                int idx = -1;
                                int ma = -1;
                                for (int i = 0; i < n; i ++) {
                                        if (ma < depth[i] && color[i] == 2) {
                                                ma = depth[i];
                                                idx = i;
                                        }
                                }
                                if (idx == -1) {
                                        break;
                                }
                                /*
                                cerr << "color : a" << endl;
                                for (int i = 0; i < n; i ++) cerr << color[i] << " : " << a[i] << endl;
                                cerr << "insert" << endl;
                                */
                                insert(idx, a[0], color[0]);
                                ans.push_back(idx);
                                /*
                                cerr << "color : a" << endl;
                                for (int i = 0; i < n; i ++) {
                                        cerr << color[i] << " : " << a[i] << endl;
                                }
                                */
                        }
                }
                for (int i = 0; i < n; i ++) {
                        if (path[i]) {
                                color[i] = -1;
                        }
                }
        }
        //cerr << "ans" << endl;
        printf("%d\n", (int) ans.size());
        for (int i = 0; i < (int) ans.size(); i ++) {
                printf("%d\n", ans[i]);
        }
        return 0;
}


Measured memory_bytes: 768