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

#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"

const int N = 3e5+5;

struct DSU
{
    vector<int> par, sz;

    void init(int n)
    {
        par = sz = vector<int> (n+1, 0);
        for(int i=1; i<=n; i++)
            par[i] = i, sz[i] = 1;
    }
    int getPar(int x)
    {
        return x == par[x] ? x : par[x] = getPar(par[x]);
    }
    void unite(int x, int y)
    {
        int par1 = getPar(x), par2 = getPar(y);

        if(par1 == par2) return;

        if(sz[par1] > sz[par2])
            swap(par1, par2);

        sz[par2] += sz[par1];
        sz[par1] = 0;
        par[par1] = par2;
    }
    bool isSameSet(int u,int v)
    {
        return getPar(u) == getPar(v);
    }
};

int n, k, root;
vector<vector<int>> g, h, ng, comp;
int p[N];
vector<int> order, pos1, pos;

bool topoSort(vector<vector<int> > &graph)
{
    queue<int> q;
    vector<int> indeg(n+1, 0);
    order.clear();

    for(int i=1; i<=n; i++)
    {
        for(int &it : graph[i])
            indeg[it]++;
    }
    for(int i=1; i<=n; i++)
        if(!indeg[i]) q.push(i);
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        order.push_back(u);
        for(int &it : graph[u])
        {
            indeg[it]--;
            if(!indeg[it]) q.push(it);
        }
    }
    return (order.size()==n);
}


int vis[N];


bool dfs(int v) //checks cycle
{
    for (int u : g[v])
    {
        if (pos[u] < pos[v])
            return false;
        if (!dfs(u))
            return false;
    }
    return true;
}

int32_t main()
{
    IOS;

    cin>>n>>k;

    DSU dsu;
    dsu.init(n);

    g.resize(n+5);
    h.resize(n+5);
    ng.resize(n+5);

    for(int i=1; i<=n; i++)
    {
        cin>>p[i];
        if(p[i]) g[p[i]].push_back(i);
        else root = i;
    }
    while(k--)
    {
        int u, v;
        cin>>u>>v;
        h[u].push_back(v);
        dsu.unite(u, v);
    }
    if(!topoSort(h))
    {
        cout<<0;
        return 0;
    }
    vector<int> order1 = order;
    pos.resize(n+5);
    for(int i=0; i<n; i++) pos[order1[i]] = i;

    for(int i=1; i<=n; i++)
    {
        for(int &it : g[i])
            if(!dsu.isSameSet(i, it))
                ng[dsu.getPar(i)].push_back(dsu.getPar(it));
    }

    if(!topoSort(ng))
    {
        cout<<0;
        return 0;
    }

    comp.resize(n+5);
    for(int i=1; i<=n; i++)
    {
        comp[dsu.getPar(i)].push_back(i);
    }

    vector<int> ans;
    pos.resize(n+5);
    for(int it : order)
    {
        sort(comp[it].begin(), comp[it].end(), [&] (int u, int v)
        {
            return pos[u] < pos[v];
        });
        for(int v : comp[it])
            ans.push_back(v);
    }
    for(int i=0; i<n; i++) pos[ans[i]]=i;

    if(!dfs(root))
    {
        cout<<0;
        return 0;
    }

    for(auto it : ans) cout<<it<< " ";
    return 0;
}



