#include<bits/stdc++.h>
using namespace std;
#define _rep(i, x, y) for(int i = (int)x; i < (int)y; ++i)
#define _dep(i,x,y) for(int i = (int)x; i > (int)y; i--)
#define PII pair<int,int>
#define eb emplace_back
#define pb push_back
#define fi first
#define se second
#define PQ priority_queue
#define lb lower_bound
#define ub upper_bound
#define all(x) (x).begin(), (x).end()
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VII;
typedef vector<ll> VL;
typedef vector<vector<ll>> VLL;
constexpr int mod = 1e9 + 7;
constexpr int KINF = 0x3f3f3f3f;
constexpr double eps = 1e-7;
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	int n, k;
	cin >> n >> k;
	VII g(n + 1);
	VI deg(n + 1), p(n + 1);
	bool ok = true;
	_rep(i, 1, n + 1){
		cin >> p[i];
		if(!p[i]) continue;
		if(p[i] == i) ok = false;
		g[p[i]].eb(i), deg[i]++;
	}
	VI nxt(n + 1), fa(n + 1), ed(n + 1);
	iota(all(fa), 0);
	iota(all(ed), 0);
	function<int(int)> find = [&](int x){
		if(x == fa[x]) return x;
		return fa[x] = find(fa[x]);
	};
	_rep(i, 0, k){
		int x, y;
		cin >> x >> y;
		if(fa[y] != y || nxt[x]) ok = false;
		nxt[x] = y;
		int fx = find(x), fy = find(y);
		if(fx == fy) ok = false;
		fa[fy] = fx;
		deg[fx] += deg[fy];
		ed[fx] = ed[y];
	}
	if(!ok){
		cout << 0 << endl;
		return 0;
	}
	_rep(i, 1, n + 1)
		if(fa[i] == i){
			for(int v = i; v; v = nxt[v]){
				int tmp = find(p[v]);
				if(tmp == i){
					cout << 0 << endl;
					return 0;
				}
				for(int& vv : g[v]){
					int fvv = find(vv);
					if(fvv == i) -- deg[i], p[vv] = 0;
				}
			}
		}
	queue<int> q;
	int ls = 0;
	_rep(i, 1, n + 1) if(fa[i] == i && !deg[i]) q.push(i);
	while(!q.empty()){
		int u = q.front();
		q.pop();
		nxt[ls] = u, ls = ed[u];
		for(int v = u; v; v = nxt[v]){
			for(int& vv : g[v]){
				int fvv = find(vv);
				if(fvv != u && --deg[fvv] == 0) q.push(fvv);
			}
		}
	}
	VI ans;
	for(int i = nxt[0]; i; i = nxt[i]) ans.eb(i);
	if((int)ans.size() < n) {
		cout << 0 << endl;
		return 0;
	}
	_rep(i, 0, n) cout << ans[i] << " \n"[i == n - 1];
	return 0;
} 
// 注意int转long long会溢出
// dp记得处理非法状态

