#include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << endl
using namespace std;
const int N = 300005;
int fa[N], son[N], pre[N], nxt[N], p[N], d[N];

int get_fa(int x) {
    if(x == fa[x]) return x;
    int P = get_fa(fa[x]);
    d[x] += d[fa[x]];
    return fa[x] = P;
}

int get_son(int x) {
    return x == son[x] ? x : son[x] = get_son(son[x]);
}

struct Edge {
    int v, nxt, id;
} G[N << 1];

int head[N], tot, n, k;

void add(int x, int y, int id) {
    G[++tot].v = y; G[tot].id = id;
    G[tot].nxt = head[x]; head[x] = tot;
}

bool v[N];
int du[N];
deque<int> q;
vector<int> ans;
void tpsort() {
    while(!q.empty()) q.pop_front();
    for(int i = 1; i <= n; i++) v[i] = false;
    for(int i = 1; i <= n; i++) if(!du[i]) q.push_back(i);
    while(!q.empty()) {
        int x = q.front(); q.pop_front();
        if(v[x]) continue;
//        debug(x);
        ans.push_back(x);
        v[x] = true;
        for(int i = head[x]; i; i = G[i].nxt) {
            int y = G[i].v; du[y]--;
        }
        for(int i = head[x]; i; i = G[i].nxt) {
            int y = G[i].v, id = G[i].id;
            if(!du[y]) {
                if(id) q.push_front(y);
                else q.push_back(y);
            }
        }
    }
    if(ans.size() < n) {
        puts("0");
        return;
    }
    for(auto now : ans) printf("%d ", now);
    puts("");
}

int main()
{
    scanf("%d %d", &n, &k);
    for(int i = 1; i <= n; i++) pre[i] = nxt[i] = -1, d[i] = 0;
    for(int i = 1; i <= n; i++) fa[i] = son[i] = i;
    for(int i = 1; i <= n; i++) scanf("%d", p + i);
    for(int i = 1; i <= k; i++) {
        int x, y; scanf("%d %d", &x, &y);
        int fx = get_fa(x), fy = get_fa(y);
        if(nxt[x] == -1 && pre[y] == -1 && fx != fy) {
            nxt[x] = y; pre[y] = x;
            fa[x] = y;
            d[x] = 1;
            son[y] = x;
            add(x, y, 1);
//            cout << x << "->" << y << endl;
            du[y]++;
            continue;
        }
        puts("0");
        return 0;
    }
    for(int i = 1; i <= n; i++) {
        int x = p[i], y = i;
        if(!p[i]) continue;
        int fx = get_fa(x), fy = get_fa(y), sy = get_son(y);
        if(fx == fy) {
            if(d[x] < d[y]) {
                puts("0");
                return 0;
            }
            continue;
        }
//        cout << fx << "->" << sy << endl;
        add(fx, sy, 0);
        du[sy]++;
    }
    tpsort();
    return 0;
}
/*
Input
5 2
2 3 0 5 3
1 5
5 4
Output
3 2 1 5 4
Input
5 2
2 3 0 5 3
1 5
5 1
Output
0
Input
5 1
2 3 0 5 3
4 5
Output
0
Input
5 4
2 3 0 5 3
2 1
3 5
5 2
1 4
Output
3 5 2 1 4
*/
