#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int n,k,cnt,tot,fa[N],P[N],at[N],in[N],tp[N],pre[N],head[N],to[N],nxt[N];queue <int> q;vector <int> tmp; 
inline int find(int x){return fa[x]=(fa[x]==x)?fa[x]:find(fa[x]);}
inline void add(int u,int v){to[++cnt]=v,nxt[cnt]=head[u],head[u]=cnt;}
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++) scanf("%d",&pre[i]),fa[i]=i;
	for(int i=1;i<=k;i++)
	{
		int x,y; scanf("%d%d",&x,&y);
		int fx=find(x),fy=find(y); tp[x]=y;
		if(fx==fy){ puts("0"); return 0; }
		fa[fy]=fx;		
	}
	for(int i=1;i<=n;i++)
	{
		if(!pre[i]) continue;
		int u=find(pre[i]),v=find(i);
		if(u!=v) add(u,v),in[v]++;
	}
	for(int i=1;i<=n;i++) if(i==find(i) && !in[i]) q.push(i);
	while(!q.empty())
	{
		int u=q.front(); q.pop(); tmp.push_back(u);
		for(int i=head[u];i;i=nxt[i])
		{
			int v=to[i];
			in[v]--; if(!in[v]) q.push(v);
		} 
	}
	for(int i=1;i<=n;i++) if(i==find(i) && in[i]){ puts("0"); return 0; }
	int sz=tmp.size();
	for(int i=0;i<sz;i++)
	{
		int now=tmp[i];
		while(now) P[++tot]=now,now=tp[now];
	}
	for(int i=1;i<=n;i++) at[P[i]]=i;
	for(int i=1;i<=n;i++)
	{
		if(!pre[i]) continue;
		if(at[pre[i]]>at[i]){ puts("0"); return 0; }
	}
	for(int i=1;i<=n;i++) printf("%d ",P[i]);
} 