func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100001;   int n, m, ind[N], dpth[N], s[N], e[N], t, seg[4 * N], lazy[4 * N], a[N];   vector<vector<int> > g, gift;   vector<pair<int, int> > anc;   vector<int> ans, root;   void dfs(int u) {     s[u] = t++;     for (int i = 0; i < g[u].size(); i++) {       dpth[g[u][i]] = dpth[u] + 1;       dfs(g[u][i]);     }     e[u] = t - 1;   }   void dfs2(int u) {     if (gift[a[u]].empty()) {       anc.push_back(make_pair(-dpth[a[u]], a[u]));     }     gift[a[u]].push_back(u);     for (int i = 0; i < g[u].size(); i++) dfs2(g[u][i]);   }   void checkLazy(int p, int s, int e) {     if (lazy[p] != 0) {       seg[p] += (e - s + 1) * lazy[p];       if (s != e) lazy[2 * p] += lazy[p], lazy[2 * p + 1] += lazy[p];       lazy[p] = 0;     }   }   void build(int p, int s, int e) {     if (s == e) {       seg[p] = 1;       lazy[p] = 0;       return;     }     build(2 * p, s, (s + e) / 2);     build(2 * p + 1, (s + e) / 2 + 1, e);     seg[p] = seg[2 * p] + seg[2 * p + 1];     lazy[p] = lazy[2 * p] + lazy[2 * p + 1];   }   void update(int p, int s, int e, int a, int b, int v) {     checkLazy(p, s, e);     if (s >= a && e <= b) {       seg[p] += (e - s + 1) * v;       if (s != e) lazy[2 * p] += v, lazy[2 * p + 1] += v;       return;     }     if (s > b || e < a) return;     update(2 * p, s, (s + e) / 2, a, b, v);     update(2 * p + 1, (s + e) / 2 + 1, e, a, b, v);     seg[p] = seg[2 * p] + seg[2 * p + 1];   }   int get(int p, int s, int e, int a) {     checkLazy(p, s, e);     if (s == e) return seg[p];     if (a <= (s + e) / 2) return get(2 * p, s, (s + e) / 2, a);     return get(2 * p + 1, (s + e) / 2 + 1, e, a);   }   int main() {     std::ios::sync_with_stdio(false);     scanf( %d%d , &n, &m);     g.resize(n);     memset(ind, 0, sizeof(ind));     build(1, 0, n - 1);     for (int i = 0, a, b; i < m; i++) {       scanf( %d%d , &a, &b);       a--, b--;       g[a].push_back(b);       ind[b]++;     }     for (int i = 0; i < n; i++)       if (ind[i] == 0) root.push_back(i);     for (int i = 0; i < n; i++) {       scanf( %d , a + i);       a[i]--;     }     t = 0;     gift.resize(n);     for (int i = 0; i < root.size(); i++) {       int r = root[i];       dpth[r] = 0;       dfs(r);       anc.clear();       dfs2(r);       sort(anc.begin(), anc.end());       for (int j = 0; j < anc.size(); j++) {         for (int k = 0; k < gift[anc[j].second].size(); k++)           if (get(1, 0, n - 1, s[gift[anc[j].second][k]]) <= 0) {             puts( -1 );             return 0;           }         ans.push_back(anc[j].second + 1);         update(1, 0, n - 1, s[anc[j].second], e[anc[j].second], -1);       }     }     printf( %d n , ans.size());     for (int i = 0; i < ans.size(); i++) printf( %d n , ans[i]);     return 0;   }   