#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mit map<int,int>::iterator
#define sit set<int>::iterator
#define itrm(g,x) for(mit g=x.begin();g!=x.end();g++)
#define itrs(g,x) for(sit g=x.begin();g!=x.end();g++)
#define ltype int
#define rep(i,j,k) for(ltype(i)=(j);(i)<=(k);(i)++)
#define rap(i,j,k) for(ltype(i)=(j);(i)<(k);(i)++)
#define per(i,j,k) for(ltype(i)=(j);(i)>=(k);(i)--)
#define pii pair<int,int>
#define fi first
#define se second
#define mpr make_pair
#define pb push_back
#define fastio ios::sync_with_stdio(false)
#define check(x) if(x>=mod) x-=mod
const int inf=0x3f3f3f3f,mod=1000000007;
const double pi=3.1415926535897932,eps=1e-6;
void chmax(int &x,int y){if(x < y) x = y;}
void chmin(int &x,int y){if(x > y) x = y;}
int qpow(int x,int y){
    int ret = 1;
    while(y) {
        if(y & 1) ret = (ll)ret * x % mod;
        x = (ll)x * x % mod;
        y >>= 1;
    }
    return ret;
}
pii req[300005];
int n,k,fa[300005],lst[300005],tick[300005];
int in[300005],id[300005];
bool lend[300005],vis[300005];
vector<int> empty;
vector<vector<int>> link;
vector<int> v[300005];
vector<int> ord,ans;
void fail(){puts("0");exit(0);}
int main()
{
    scanf("%d%d",&n,&k);
    rep(i,1,n) lend[i] = 1;
    rep(i,1,n) {scanf("%d",fa+i);}
    rep(i,1,k) {
        int a,b;
        scanf("%d%d",&a,&b);
        //if(fa[b] != a) fail();
        lend[a] = 0;
        lst[b] = a;
        req[i] = mpr(a,b);
    }
    link.pb(empty);
    rep(i,1,n) if(lend[i]) {
        int lid = link.size();
        vector<int> cur;
        int ii = i;
        while(ii) {
            if(vis[ii]) fail();
            cur.pb(ii);
            vis[ii] = 1;
            if(lst[ii]) ii = lst[ii];
            else break;
        }
        rap(j,0,cur.size()) id[cur[j]] = lid;
        link.pb(cur);
    }
    int m = (int)link.size() - 1;
    rep(i,1,m) {
        vector<int> & cur = link[i];
        rap(j,0,cur.size()){
            //printf("%d ",cur[j]);
            int x = cur[j];
            if(fa[x] && id[fa[x]] != id[x]) {
                v[id[fa[x]]].pb(id[x]);
                in[id[x]]++;
            }
        }
        //puts("");
    }
    queue<int> q;
    rep(i,1,m) if(!in[i]) q.push(i);
    int cnt = 0;
    while(!q.empty()) {
        cnt++;
        int x = q.front();q.pop();
        ord.pb(x);
        rap(i,0,v[x].size()){
            int to = v[x][i];
            in[to]--;
            if(!in[to]) q.push(to);
        }
    }
    //rap(i,0,ord.size()) printf("%d ",ord[i]);
    if(cnt != m) fail();
    rap(i,0,m) {
        int x = ord[i];
        per(j,(int)link[x].size()-1,0) ans.pb(link[x][j]);
    }
    rap(i,0,ans.size()) {
        tick[ans[i]] = i + 1;
    }
    rep(i,1,n) if(fa[i] && tick[i] < tick[fa[i]]) fail();
    rep(i,1,k) if(tick[req[i].se] != tick[req[i].fi] + 1) fail();
    rap(i,0,ans.size()) printf("%d ",ans[i]);
    return 0;
}