#include<bits/stdc++.h>
#define N 300100
using namespace std;
int a[N],f[N],ans[N],nxt[N],n,m,deg[N];
vector<int>g[N];
int vis[N];
queue<int>q;
int find(int x){
	if(x!=f[x])f[x]=find(f[x]);
	return f[x];
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)f[i]=i;
	int x,y;
	int bo=1;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		int fx=find(x),fy=find(y);
		if(fx!=fy){
			f[fy]=fx;
		}
		else bo=0;
		nxt[x]=y;
	}
	if(bo==0){
		printf("0");return 0;
	}
	for(int i=1;i<=n;i++){
		if(find(i)==i){
			int t=i;
			while(nxt[t]){
				g[t].push_back(nxt[t]);
				deg[nxt[t]]++;
				t=nxt[t];
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i]==0)continue;
		 g[a[i]].push_back(i);deg[i]++;
	}
	for(int i=1;i<=n;i++)
	if(deg[i]==0)q.push(i);
	int cnt=0;
//	cout<<q.size()<<endl;
	while(!q.empty()){
		int x=q.front();q.pop();
		cnt++;
		for(int to:g[x]){
			deg[to]--;
			if(!deg[to])q.push(to);
		}
	}
	if(cnt<n)printf("0");
	else{
		for(int i=1;i<=n;i++)g[i].clear(),deg[i]=0;
		for(int i=1;i<=n;i++){
			if(a[i]==0)continue;
			int l=find(a[i]),r=find(i);
			vis[l]=vis[r]=1;
			if(l!=r)g[l].push_back(r),deg[r]++;
		}
		while(!q.empty())q.pop();
		for(int i=1;i<=n;i++){
			if(deg[i]==0&&vis[i])q.push(i);
		}
		int cnt=0;
		while(!q.empty()){
			int x=q.front();q.pop();
			ans[++cnt]=x;
			for(int to:g[x]){
				deg[to]--;
				if(!deg[to])q.push(to);
			}
		}
		bo=1;
		for(int i=1;i<=n;i++){
			if(deg[i]){
				bo=0;break;
			}
		}
		if(bo==0){
			printf("0");return 0;
		}
		for(int i=1;i<=cnt;i++){
			if(nxt[ans[i]]==0)
			printf("%d ",ans[i]);
			else{
				int t=ans[i];
				while(t){
					printf("%d ",t);t=nxt[t];
				}
			//	printf("%d",t);
			}
		}
	}
	return 0;
}