#include <bits/stdc++.h>
using namespace std;
#define INF 10000000000000LL
typedef long long int ll;
typedef pair<ll,ll> ii;
typedef pair<ii,ll> iii;
typedef vector<ll> vi;
typedef vector<ii> vii;
#define getbit(n,i) (((n)&(1LL<<(i)))!=0)
#define setbit0(n,i) ((n)&(~(1LL<<(i))))
#define setbit1(n,i) ((n)|(1LL<<(i)))
#define lastone(n) ((n)&(-(n)))
#define read freopen("debug//in.txt","r",stdin)
#define write freopen("debug//out.txt","w",stdout)
#define DBG(a) cerr<<#a<<" ->->->-> "<<a<<"\n"
#define fi first
#define se second
#define PI (acos(-1))
#define fastread ios::sync_with_stdio(false);cin.tie(NULL)
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mod (1000000007)
#define asz 300005
template<class T,class V> ostream& operator<<(ostream &s,pair<T,V> a)
{
    s<<a.fi<<' '<<a.se;
    return s;
}
vi adj[asz];
vi rev[asz];
vi ts;
int vis[asz];
void dfs(int ind){
    if(vis[ind])return;
    vis[ind]=1;
    for(auto x:adj[ind])dfs(x);
    ts.push_back(ind);
}

class Unionfind
{
public:
    vi p,rnk;
    Unionfind(int N){p.assign(N,0);rnk.assign(N,1);for(int i=0;i<N;i++)p[i]=i;}
    int findset(int i){return p[i]=(p[i]==i)?i:findset(p[i]);}
    bool sameset(int i,int j){return findset(i)==findset(j);}
    void unionset(int i,int j)
    {
        int x=findset(i),y=findset(j);
        if(x!=y)
        {
            if(rnk[x]>rnk[y])p[y]=x;
            else p[x]=y,rnk[y]+=(rnk[x]==rnk[y]);
        }
    }
};

int main()
{
    fastread;
#ifdef FILE_IO2
    read;
    write;
#endif
    int T=1;
    //cin>>T;
    for(int qq=1; qq<=T; qq++){
        int n,m;
        cin>>n>>m;
        vi v(n);
        for(auto &x:v)cin>>x;
        Unionfind un(n+1);
        vi in(n+1),out(n+1);
        for(int i = 0;i<m;i++){
            int x,y;
            cin>>x>>y;
            if(in[y]||out[x]){
                cout<<0<<endl;
                return 0;
            }
            in[y]=x;
            out[x]=y;
            un.unionset(x,y);
        }
        for(int i=1;i<=n;i++){
            if(v[i-1] == 0)continue;
            adj[un.findset(v[i-1])].push_back(un.findset(i));
            rev[un.findset(i)].push_back(un.findset(v[i-1]));
        }

        for(int i=1;i<=n;i++){
            dfs(un.findset(i));
        }
        vi ans;
        memset(vis,0,sizeof vis);
        while(!ts.empty()){
            int x = ts.back();
            ts.pop_back();
            for(auto y:rev[x])
                if(!vis[y]&&x!=y){
                    cout<<0<<endl;
                    return 0;
                }
            int p=x;
            while(in[x]){
                x=in[x];
                if(vis[x]||p==x){
                    cout<<0<<endl;
                    return 0;
                }
            }
            if(v[x-1]&&!vis[v[x-1]]){
                cout<<0<<endl;
                return 0;
            }
            vis[x]=1;
            ans.push_back(x);
            while(out[x]){
                if(!vis[v[out[x]-1]]||vis[out[x]]){
                    cout<<0<<endl;
                    return 0;
                }
                ans.push_back(out[x]);
                x=out[x];
                vis[x]=1;
            }
        }
        for(auto x:ans)cout<<x<<' ';
        cout<<endl;
    }
}

