// R2GM #1 : https://codeforces.com/contestInvitation/f7701c88f757d6d10e038e205a87bc1bfe752649
// Nobody else is stronger than I am
// Yesterday I moved a mountain
// I bet I could be your hero
// I am a mighty little man

// how many dfs do you need?
// me : yes
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
const int MAX = 3e5 + 10;
int par[MAX];
int p[MAX], indeg[MAX], outdeg[MAX], col[MAX];
vector <int> g[MAX], v[MAX], topo;
bool cycle;
int find(int u) {
    return par[u];
}
void mark(int u, int p) {
    par[u] = p;
    for(int x : v[u]) mark(x, p);
}
void dfs0(int u) {
    col[u] = 1;
    for(int v : g[u]) {
        if(!col[v]) dfs0(v);
        if(col[v] == 1) cycle = true;
    }
    col[u] = 2;
}
void dfs1(int u) {
    col[u] = 1;
    for(int v : g[u]) {
        if(!col[v]) dfs1(v);
    }
    topo.push_back(u);
}
void dfs2(int u) {
    cout << u << " ";
    for(int x : v[u]) dfs2(x);
}
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    
    int n, k; cin >> n >> k;
    int root = 0;
    for(int i = 1; i <= n; i ++) {
        cin >> p[i];
        if(!p[i]) root = i;
        else g[p[i]].push_back(i);
    }
    for(int i = 1; i <= k; i ++) {
        int x, y; cin >> x >> y;
        outdeg[x] ++, indeg[y] ++;
        g[x].push_back(y);
        v[x].push_back(y);
    }
    for(int i = 1; i <= n; i ++) {
        if(indeg[i]) continue;
        mark(i, i);
    }
    for(int i = 1; i <= n; i ++) {
        sort(g[i].begin(), g[i].end());
        g[i].erase(unique(g[i].begin(), g[i].end()), g[i].end());
    }
    dfs0(root);
    if(*max_element(indeg + 1, indeg + n + 1) > 1 || *max_element(outdeg + 1, outdeg + n + 1) > 1 || cycle) {
        return cout << 0, 0;
    }
    for(int i = 1; i <= n; i ++) g[i].clear(), col[i] = 0;
    for(int i = 1; i <= n; i ++) {
        if(find(i) == find(p[i])) continue;
        g[find(p[i])].push_back(find(i));
    }
    dfs0(find(root));
    if(cycle) return cout << 0, 0;
    for(int i = 1; i <= n; i ++) col[i] = 0;
    for(int i = 1; i <= n; i ++) {
        if(i != find(i) || col[i]) continue;
        dfs1(i);
    }
    reverse(topo.begin(), topo.end());
    for(int x : topo) dfs2(find(x));
    for(int i = 1; i <= n; i ++) {
        if(!col[find(i)]) dfs2(find(i));
    }

    return 0;
}