#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int f[300010];
int find(int x)
{
	return x==f[x]?x:f[x]=find(f[x]);
}
int fa[300010];
vector<int>e[300010];
int d[300010];
queue<int>q;
int order[300010],nxt[300010];
bool vis[300010],t[300010];
int c[300010];
void solve(int T)
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		f[i]=i;
	}
	for(int i=1;i<=n;i++)
	{
		int u;
		cin>>u;
		fa[i]=u;
	}
	for(int i=1;i<=k;i++)
	{
		int u,v;
		cin>>u>>v;
		nxt[u]=v;
		int fau=find(u),fav=find(v);
		if(fau!=fav) f[fav]=fau;
	}
	for(int i=1;i<=n;i++)
	{
		find(i);
	}
	int tot=0;
	for(int i=1;i<=n;i++)
	{
		//cout<<f[i]<<" ";
		if(!t[f[i]])
		{
			tot++;
			t[f[i]]=1;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(!fa[i]) continue;
		int u=fa[i];
		if(f[u]==f[i]) continue;
		e[f[u]].push_back(f[i]);
		d[f[i]]++;
	}
	// for(int i=1;i<=n;i++)
	// {
	// 	cout<<d[i]<<" ";
	// }
	// cout<<endl;
	for(int i=1;i<=n;i++)
	{
		if(!d[f[i]])
		{
			q.push(f[i]);
			break;
		}
	}
	int cnt=0;
	int pos=0;
	bool flag=1;
	while(!q.empty())
	{
		int u=q.front();
		//cout<<u<<endl;
		q.pop();
		order[++pos]=u;
		if(vis[u])
		{
			flag=0;
			break;
		}
		vis[u]=1;
		cnt++;
		for(auto v:e[u])
		{
			//cout<<u<<" "<<v<<endl;
			d[v]--;
			if(!d[v]) q.push(v);
		}
	}
	//cout<<cnt<<endl;
	if(cnt!=tot)
	{
		cout<<0<<endl;
		return;
	}
	vector<int>ans;
	cnt=0;
	for(int i=1;i<=pos;i++)
	{
		int w=order[i];
		for(int j=w;j!=0;j=nxt[j])
		{
			//cout<<j<<endl;
			ans.push_back(j);
			c[j]=++cnt;
			//cout<<j<<" "<<c[j]<<" "<<cnt<<endl;
			if(ans.size()>n)
			{
				cout<<0<<endl;
				return;
			}
		}
	}
	//cout<<cnt<<endl;
	for(int i=1;i<=n;i++)
	{
		//cout<<c[i]<<endl;
		if(fa[i]==0) continue;
		if(c[i]<c[fa[i]])
		{
			cout<<0<<endl;
			return;
		}
	}
	for(auto x:ans)
	{
		cout<<x<<" ";
	}
}
//#define ONLINE_JUDGE
signed main()
{
    #ifndef ONLINE_JUDGE
    freopen("lotato.in","r",stdin);
    freopen("lotato.out","w",stdout);
    #endif
    int t=1;
    //scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        solve(i);
    }
    return 0;
}