#include "bits/stdc++.h"
#define hhh cerr<<"hhh"<<endl
#define see(x) cerr<<(#x)<<'='<<(x)<<endl
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&c<48)c=getchar();if(c=='-')f=-1,c=getchar();while(c>47)x=x*10+(c^48),c=getchar();return f*x;}

const int maxn = 3e5+7;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;

vector<int> s[maxn];
int in[maxn], num[maxn], fa[maxn];
int p[maxn], TO[maxn], used[maxn];

int head[maxn], to[maxn*2], nxt[maxn*2], tot;
inline void add_edge(int u, int v) {
    ++tot; to[tot]=v; nxt[tot]=head[u]; in[v]++; head[u]=tot;
}

int main() {
    int n=read(), k=read();
    for(int i=1; i<=n; ++i) p[i]=read();
    int fail=0;
    for(int i=1; i<=k; ++i) {
        int u=read(), v=read();
        if(in[v]) fail=1;
        if(TO[u]) fail=1;
        in[v]++; TO[u]=v;
    }
    if(fail) return printf("0\n"), 0;
    for(int i=1; i<=n; ++i) if(!in[i]) {
        int u=i;
        while(u) used[u]=1, s[i].push_back(u), num[u]=s[i].size(), fa[u]=i, u=TO[u];
    }
    for(int i=1; i<=n; ++i) if(!used[i]) return printf("0\n"), 0;
    for(int i=1; i<=n; ++i) in[i]=0;
    for(int i=1; i<=n; ++i) if(p[i]) {
        int u=p[i], v=i;
        if(fa[u]==fa[v]) {
            if(num[u]>num[v]) return printf("0\n"), 0;
        }
        else {
            u=fa[u], v=fa[v];
            add_edge(u,v);
        }
    }
    vector<int> ans;
    queue<int> q;
    for(int i=1; i<=n; ++i) if(!in[i]&&fa[i]==i) q.push(i);
    while(q.size()) {
        int u=q.front(); q.pop();
        ans.insert(ans.end(),s[u].begin(),s[u].end());
        for(int i=head[u]; i; i=nxt[i]) {
            int v=to[i];
            if(--in[v]==0) q.push(v);
        }
    }
    if(ans.size()<n) return printf("0\n"), 0;
    for(int i=0; i<n; ++i) printf("%d%c", ans[i], " \n"[i==n-1]);
}