#include <bits/stdc++.h>      #define MULTI_TEST false   #define int long long   #define double long double      //#pragma GCC optimize( Ofast )   //#pragma GCC optimize( no-stack-protector )   //#pragma GCC optimize( unroll-loops )   //#pragma GCC target( sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native )      #define all(x) x.begin(), x.end()      using namespace std;      const int INF = 1e18;      int n, k;   vector<vector<int>> g;   vector<int> p;   vector<int> chainp, chainc;   vector<vector<int>> chains;   vector<vector<int>> g1;   vector<int> tin, tout;   vector<int> group;   vector<int> used, used1;   vector<int> ts;      int timer = 1;      int bad = 0;      void dfs(int v) {       used[v] = 1;       int x = chainc[v];       if (used[x] == 1) {           bad = 1;           return;       }       if (used[x] == 0) {           dfs(x);       }       used[v] = 2;   }      void dfs1(int v) {       used1[v] = 1;       for (auto &x: g1[v]) {           if (used1[x] == 1) {               bad = 1;               return;           }           if (used1[x] == 0) {               dfs1(x);           }       }       used1[v] = 2;       ts.push_back(v);   }      void solve() {       cin >> n >> k;       p.resize(n);       g.resize(n);       tin.resize(n, -1);       tout.resize(n, -1);       chainp.resize(n, -1);       chainc.resize(n, -1);       int q = 0;       for (int i = 0; i < n; i++) {           int x;           cin >> x;           x--;           p[i] = x;       }       for (int i = 0; i < k; i++) {           int x, y;           cin >> x >> y;           x--;           y--;           chainp[y] = x;           chainc[x] = y;       }       used.resize(n, 0);       used1.resize(n, 0);       group.resize(n, -1);       for (int i = 0; i < n; i++) {           if (used[i] == 0)               dfs(i);       }       if (bad == 1) {           cout << 0;           return;       }       for (int i = 0; i < n; i++) {           if (chainp[i] == -1) {               chains.emplace_back();               int v = i;               group[v] = chains.size() - 1;               chains.back().push_back(v);               while (chainc[v] != -1) {                   v = chainc[v];                   group[v] = chains.size() - 1;                   chains.back().push_back(v);               }           }       }       g1.resize(chains.size());       for (int i = 0; i < n; i++) {           if (p[i] != -1) {               int x = p[i];               if (group[x] != group[i]) {                   g1[group[x]].push_back(group[i]);               }           }       }       for (int i = 0; i < g1.size(); i++) {           if (used1[i] == 0) {               dfs1(i);           }       }       reverse(all(ts));       vector<int> fin;       if (bad == 1) {           cout << 0;           return;       }       for (auto &x: ts) {           for (auto &y: chains[x]) {               fin.push_back(y);           }       }       map<int, int> topos;       for (int i = 0; i < n; i++) {           topos[fin[i]] = i;       }       for (int i = 0; i < n; i++) {           if (p[i] != -1) {               int x = i;               int y = p[i];               if (topos[y] > topos[x])                   bad = 1;           }       }       if (bad == 1) {           cout << 0;           return;       }       for (auto &x: fin) {           cout << x + 1 <<    ;       }   }      signed main() {       cin.tie(0);       ios::sync_with_stdio(false);      #ifdef DEBUG       freopen( input.txt ,  r , stdin);       freopen( output.txt ,  w , stdout);   #endif       int t = 1;       if (MULTI_TEST)           cin >> t;       while (t--)           solve();       return 0;   }