#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef long double ld;
//typedef tree<int,null_type,less<int >,rb_tree_tag,tree_order_statistics_node_update>indexed_set;
template<class T1, class T2>
ostream &operator <<(ostream &os, pair<T1,T2>&p);
template <class T>
ostream &operator <<(ostream &os, vector<T>&v);
template <class T>
ostream &operator <<(ostream &os, set<T>&v);
template <class T1, class T2>
ostream &operator <<(ostream &os, map<T1,T2>&v);
#ifdef APURBA
#define HERE cout<<"here - "<<__LINE__<<"\n";
#define debug(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it)
{
    cout<<endl;
}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args)
{
    cout << *it << " = " << a << " ";
    err(++it, args...);
}
#else
#define HERE
#define debug(args...)
#endif
const int N = 3e5+5;
const ll mod = 1e9 + 7;
typedef pair<int,int> pii;

vector<int>g1[N];//main graph
vector<int>g2[N];
vector<int>g3[N];
vector<int>in[N];
int color[N];
map<pii,bool>mp;
int n,m;

bool cycle(int s)
{
    color[s] = 1;
    for(int i:g1[s])
    {
        if(color[i]==0)
        {
            if(cycle(i))
                return true;
        }
        else if(color[i]==1)
        {

            return true;
        }
    }
    color[s] = 2;
    return false;
}
vector<int>order;

void topsort(int s)
{
    color[s] = 1;
    debug(s,g2[s]);
    for(int i:g2[s])
    {
        if(color[i]==0)
        {
            topsort(i);
        }
    }
    order.push_back(s);
}
map<int,int>mp2;
map<int,int>start;
int dfs(int s,int &st)
{
    start[s] = st;
    color[s] = 1;
    bool f = 0;
    int x = -1;
    for(int i:g3[s])
    {
        if(color[i]==0)
        {
            if(f==1)
            {
                HERE;
                cout<<"0\n";
                exit(1);
            }
            x = dfs(i,st);
            mp2[s] = x;
            f= 1;
        }
    }
    if(!f)
    {
        mp2[s] = s;
        return s;
    }
    return x;
}
bool bal[N];
int indeg[N];
void TEST_CASES(int cas)
{
    cin>>n>>m;
    vector<pii>e1, e2;
    for(int i=1; i<=n; i++)
    {
        int x;
        cin>>x;
        if(x==0)
            continue;
        e1.push_back({x,i});
        g1[x].push_back(i);
        in[i].push_back(x);
    }
    for(int i=1; i<=m; i++)
    {
        int u,v;
        cin>>u>>v;
        e2.push_back({u,v});
        g1[u].push_back(v);
        g3[u].push_back(v);
        bal[u] = 1;
        bal[v] = 1;
        indeg[v]++;
        mp[ {u,v}]=1;
    }
    for(int i=1; i<=n; i++)
    {
        if(color[i]==0 && cycle(i))
        {
            cout<<"0\n";
            return;
        }
    }

    memset(color,0,sizeof color);
    for(int i=1;i<=n;i++)
    {
        if(bal[i]==1 && indeg[i]==0)
        {
            int ss = i;
            dfs(ss,ss);
        }
    }
    for(auto it:e2)
    {
        g2[it.first].push_back(it.second);
    }
    debug(start,mp2);
    for(int i=1; i<=n; i++)
    {
        for(int j:in[i])
        {
            int u= j, v= i;
            if(bal[i]&& bal[j]&& start[i]==start[j])
                continue;
            if(bal[i])
            {
                assert(start.count(i));
                v = start[i];
            }
            if(bal[j])
            {
                assert(mp2.count(j));
                u = mp2[j];
            }
            g2[u].push_back(v);
        }
    }

    memset(color, 0, sizeof color);
    for(int i=1; i<=n; i++)
    {
        if(color[i]==0 && bal[i] &&indeg[i]==0)
        {
            topsort(i);
        }
    }
    for(int i=1; i<=n; i++)
    {
        if(color[i]==0)
        {
            topsort(i);
        }
    }
    reverse(order.begin(),order.end());
    debug(order);
    map<int,int>pos;
    for(int i=0;i<order.size();i++)
    {
        pos[order[i]] = i;
    }
    for(auto it:e1)
    {
        if(pos[it.second] < pos[it.first])
        {
            cout<<"0\n";
            return;
        }
    }
    for(auto it:e2)
    {
        if(pos[it.second] != pos[it.first]+1)
        {
            cout<<"0\n";
            return;
        }
    }
    for(int i:order)
    {
        cout<<i<<" ";
    }
    cout<<"\n";

}




/*
10 3
4 1 5 0 4 4 3 6 5 4
10 5
2 3
6 8
*/

int main()
{
#ifndef APURBA
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    //freopen("input.txt","r",stdin);
    //freopen("out1.txt","w",stdout);
    int t=1,cas=0;
    //cin>>t;
    while(t--)
    {
        TEST_CASES(++cas);
    }
    return 0;
}



template<class T1, class T2>
ostream &operator <<(ostream &os, pair<T1,T2>&p)
{
    os<<"{"<<p.first<<", "<<p.second<<"} ";
    return os;
}
template <class T>
ostream &operator <<(ostream &os, vector<T>&v)
{
    os<<"[ ";
    for(int i=0; i<v.size(); i++)
    {
        os<<v[i]<<" " ;
    }
    os<<" ]";
    return os;
}

template <class T>
ostream &operator <<(ostream &os, set<T>&v)
{
    os<<"[ ";
    for(T i:v)
    {
        os<<i<<" ";
    }
    os<<" ]";
    return os;
}
template <class T1, class T2>
ostream &operator <<(ostream &os, map<T1,T2>&v)
{
    for(auto i:v)
    {
        os<<"Key : "<<i.first<<" , Value : "<<i.second<<endl;
    }
    return os;
}

