#include<bits/stdc++.h>
using namespace std;

int find_par(int i,int par[])
{
	if(par[i]==i)
		return i;
	
	return par[i] = find_par(par[i],par);
}

const int maxN = 3e5+10;
vector<int> adj[maxN];

bool has_cycle = false;

void topologicalSortUtil(int v, int visited[], 
                                stack<int>& Stack) 
{ 
    visited[v] = 1; 
  
    for (auto i = adj[v].begin(); i != adj[v].end(); ++i) 
        if (!visited[*i]) 
            topologicalSortUtil(*i, visited, Stack); 
        else if(visited[*i] == 1)
        	has_cycle = true;
  
  	visited[v] = 2;
    Stack.push(v); 
} 
  
void topologicalSort(int V,vector<int> &topo_sort) 
{ 
    stack<int> Stack; 
  
    int* visited = new int[V]; 
    for (int i = 0; i < V; i++) 
        visited[i] = 0; 

    for (int i = 0; i < V; i++) 
        if (visited[i] == 0) 
            topologicalSortUtil(i, visited, Stack); 
  
    while (Stack.empty() == false) { 
        topo_sort.push_back(Stack.top()); 
        Stack.pop(); 
    } 
} 

int main()
{
	int n,k;
	cin>>n>>k;
	
	int p[n];
	int par[n];
	
	set<int> root;
	int next[n];
	memset(next,-1,sizeof(next));
	
	int pos[n];
	
	for(int i=0;i<n;i++)
	{
		cin>>p[i];
		p[i]--;
		
		par[i] = i;
		root.insert(i);
	}
	
	vector<pair<int,int> > v(k);
		
	for(int i=0;i<k;i++)
	{
		cin>>v[i].first>>v[i].second;
		
		v[i].first--,v[i].second--;
		
		int a = find_par(v[i].first,par);
		int b = find_par(v[i].second,par);
		
		if(a!=b)
		{
			par[b]=a;
		} else
		{
			cout<<0<<endl;
			return 0;
		}
		
		root.erase(v[i].second);
		next[v[i].first] = v[i].second;
	}
	
	for(auto r:root)
	{
		int c = 0;
		int c_r = r;
		
		while(r!=-1)
		{
			par[r] = c_r;
			
			pos[r] = c++;
			r = next[r];	
		}	
	}
	
	for(int i=0;i<n;i++)
	{
		if(p[i] == -1)
			continue;
			
		int a = par[p[i]];
		int b = par[i];
		
		//cout<<a<<' '<<b<<' '<<pos[p[i]]<<' '<<pos[i]<<endl;
		
		if(a!=b)
			adj[a].push_back(b);
		else
		{
			if(pos[p[i]]>pos[i])
			{
				cout<<0<<endl;
				return 0;
			}
		}
	}
	
	vector<int> topo_sort;
	topologicalSort(n,topo_sort);

	if(has_cycle)
	{
		cout<<0<<endl;
		return 0;
	}
	
	for(int i=0;i<n;i++)
	{
		if(par[topo_sort[i]] == topo_sort[i])
		{
			int start = topo_sort[i];
			
			while(start!=-1)
			{
				cout<<start+1<<' ';
				start = next[start];
			}
		}
	}
	
	cout<<endl;
	return 0;
}