#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define vec vector
#define pii pair<int, int> 
using namespace std;

const long long MAXVAL = (long long) 1e18 + 1;
const long long MOD = 1000000007ll;
//const long long MOD = 998244353ll;
const int INF = 1000000001;

long long poww(int x, long long pow) {
  if (pow == 0ll ) return 1;
  if (pow == 1ll) return x % MOD;
  long long ans = poww(x, pow >> 1) % MOD;
  ans = (ans * ans) % MOD;
  if ((pow & 1) == 1) {
    ans = (ans * x ) % MOD;
  }
  return ans % MOD;
}

ll gcd(ll x, ll y) {
  if (x == 0) return y;
  while (y) {
    x %= y;
    swap(x, y);
  }
  return x;
}

ll sq(int x, int y){ 
  return x * 1ll * x + y  * 1ll * y;
}

//vector<int> pi(1000);
//vector<int> w(1000);

//int dsu_get(int x) {
  //if (pi[x] == x) return x;
  //int res = dsu_get(pi[x]);
  //pi[x] = res;
  //return res;
//}
//void dsu_merge(int x, int y) {
  //if (x == y) return;
  //x = dsu_get(x);
  //y = dsu_get(y);
  //if (x == y) return;
  //if (w[x] > w[y]) swap(x, y);
  //pi[y] = x;
  //w[y] += w[x];
//}

//struct intr {
  //int x, a, lb, rb;
  //intr(int x_, int a_, int lb_, int rb_) {
    //x = x_;
    //a = a_;
    //lb = lb_;
    //rb = rb_;
  //}
//};
//
//vec<int> t;

//void init (int nn) {
  //n = nn;
  //t.assign (n, 0);
//}

//int sum (int r) {
  //int result = 0;
  //for (; r >= 0; r = (r & (r+1)) - 1) result += t[r];
  //return result;
//}

//void inc (int i, int delta) {
  //for (; i < n; i = (i | (i+1))) t[i] += delta;
//}
//

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int q = 1;
  //cin >> q;
  while (q-- > 0) { 
    int n,k;
    cin >> n >> k;
    vec<set<int>> gr(n);
    vec<set<int>> gr2(n);
    for (int i = 0; i < n; ++i) {
      int x;
      cin >> x;
      if (x == 0) continue;
      --x;
      gr[x].insert(i);
    }
    vec<pii> req;
    vec<int> pi(n);
    for (int i = 0; i < n; ++i) pi[i] = i;
    bool fail = false;
    vec<int> was(n, 0);
    gr2 = gr;
    vec<set<int>> gr2t(n);
    for (int i  =0; i < n; ++i) {
      for (int j : gr2[i]) {
        gr2t[j].insert(i);
      }
    }
    //for (int i = 0; i < n; ++i)labels[i] = {i};
    vec<int>was2(n, 0);
    for (int j = 0; j < k; ++j) {
      int x, y;
      cin >> x >> y;
      --x;
      --y;
      req.emplace_back(x, y);
      //cout << " req " << j << endl;
      if (gr2[y].count(x)) {
        //cout << " y -> x " << y +1 << " " << x+1 << endl;
        fail = true;
      } else {
        //if (gr[x].count(y)) {
          //gr[x].erase(gr[x].find(y));
        //}
        gr2[x].insert(y);
        if (pi[y] != y) {
          // cannot be
          //cout << " cannot bE " << fail << endl;
          fail = true;
        }
        int top = x;
        vec<int> path;
        while (top != pi[top]) {
          path.push_back(top);
          top = pi[top];
        }
        for (auto& s : path) {
          pi[s] = top;
        }
        pi[y] = pi[x];
        was[y] = 2;
      }
    }
    if (fail) {
      cout << 0 << "\n";
      continue;
    }

    function<void(int)>  dfs = [&] (int v) {
      //cout << " cur v " << v + 1 << endl;
      was2[v] = 1;
      for (int next : gr2[v]) {
        if (was2[next] == 0) {
          dfs(next);
        } else if (was2[next] == 1) {
          //cout << " next gives cycle " << next + 1 << endl;
          fail = true;
          break;
        }
      }
      was2[v] = 2;
      //cout << " OUT " << v + 1 << endl;
    };
    for (int i = 0; i < n; ++i) if (was2[i] == 0) dfs(i);
    if (fail) {
      cout << "0\n";
      continue;
    }
    vec<set<int>> grnew(n);
    for (int i = 0; i < n; ++i) {
        vec<int> path;
        int top = i;
        while (top != pi[top]) {
          path.push_back(top);
          top = pi[top];
        }
        for (int s : path) {
          pi[s] = top;
        }
      for (int out : gr[i]) {
        if (pi[out] != pi[i]) {
          grnew[pi[i]].insert(pi[out]);
        }
      }
      for (int in : gr2t[i]) {
        if (pi[in] != pi[i]) {
          grnew[pi[in]].insert(pi[i]);
        }
      }
    }
    //for (auto r: req) {
      //gr2[r.first].insert(r.second);
    //}
    vec<int> topo;
    bool cycle = false;
    vec<int> next;
    vec<int> prev;
    for (int i =0 ;i < n; ++i) {
      prev.push_back(i);
      next.push_back(i);
    }
    for (int i = 0; i < k; ++i) {
      int x = req[i].first;
      int y = req[i].second;
      next[x] = y;
      prev[y] = x;
    }

    function<void(int)>  topo_dfs = [&] (int v) {
      //cout << " cur v " << v + 1 << endl;
      was[v] = 1;
      for (int next : grnew[v]) {
        if (was[next] == 0) {
          topo_dfs(next);
        } else if (was[next] == 1) {
          //cout << " next gives cycle " << next + 1 << endl;
          cycle = true;
        }
      }
      was[v] = 2;
      //cout << " OUT of " << v + 1  << endl;
      topo.push_back(v);
    };
    for (int i = 0; i < n; ++i) {
      if (was[i]) continue;
      topo_dfs(i);
    }
    if (cycle) {
      cout << 0 << "\n";
    } else {
      reverse(topo.begin(), topo.end());
      vec<int> ans;
      vec<bool> was(n, false);
      for (int i = 0 ; i < topo.size(); ++i) {
        int x = topo[i];
        //cout << " Cur x " << x + 1 << endl;
        if (prev[x] != x) continue;
        while (x != next[x]) {
          if (was[x]) {
            //cout <<" was in " << x + 1 << endl;
            fail = true;
            break;
          }
          was[x] = true;
          //cout << " next x " << x + 1 << endl;
          ans.push_back(x);
          x = next[x];
        }
        ans.push_back(x);
      }
      if (fail || ans.size() < n) {
        cout << 0 << "\n";
      } else {
        for (auto l : ans) {
          cout << 1 + l << " ";
        }
        cout << "\n";
      }
    }


  }
  return 0;
}
