#include <bits/stdc++.h>

using namespace std;

const int MAXN = 3 * 100 * 1000 + 15;

int p[MAXN], in_path[MAXN], spadj[MAXN], h[MAXN], visited[MAXN];
bool root[MAXN];
vector<int> path[MAXN], adj[MAXN], ans;

void sDfs(int root, int v)
{
  visited[v] = true;
  in_path[v] = root;
  path[root].push_back(v);
  if(spadj[v] == 0)
    return;
  if(visited[spadj[v]])
  {
  	cout << 0 << '\n';
    exit(0);
  }
  h[spadj[v]] = h[v] + 1;
  sDfs(root, spadj[v]);
}

void dfs(int v)
{
  visited[v] = 1;
  for(auto u : adj[v])
  {
    if(visited[u] == 0)
      dfs(u);
    else if(visited[u] == 1)
    {
      cout<< 0 << '\n';
      exit(0);
    }
  }
  ans.push_back(v);
  visited[v] = 2;
}

int main()
{
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n, k, rishe;
  	cin>> n >> k;
  	fill(root, root + n + 1, 1);
  	for(int i = 1; i <= n; i++)
    {
      cin>> p[i];
      if(p[i] == 0)
        rishe = i;
    }
  	while(k--)
    {
      int u, v;
      cin>> u >> v;
      spadj[u] = v;
      root[spadj[u]] = 0;
    }
  	for(int i = 1; i <= n; i++)
		if(root[i] && !visited[i])
			sDfs(i, i);
  	for(int i = 1; i <= n; i++)
    {
      if(!visited[i])
        return cout<< 0 << '\n', 0;
    }
	fill(visited, visited + n + 1, 0);
  	for(int i = 1; i <= n; i++)
    {
      if(p[i] == 0)
        continue;
      if(in_path[i] == in_path[p[i]])
      {
        if(h[i] < h[p[i]])
          return cout<< 0 << '\n', 0;
      }
      else
        adj[in_path[p[i]]].push_back(in_path[i]);
    }
    dfs(rishe);
  	
  	reverse(ans.begin(), ans.end());
    for(auto u : ans)
    {
		for(auto v : path[u])
          cout<< v << ' ';
    }
  	cout<< '\n';
  	

	return 0;
}