#include <bits/stdc++.h>
using namespace std;
#define int ll
using ll = long long;
using db = long double;
using pi = pair<int, int>;
using mi = map<int, int>;
#define fi first
#define se second
#define vt vector
#define sz size()
#define eb emplace_back
#define endl '\n'
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}//Ҫ��MODΪ����
ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1,y=0;return a;}ll ret=exgcd(b,a%b,y,x);y-=a/b*x;return ret;}
ll getInv(int a,int mod){ll x,y;ll d=exgcd(a,mod,x,y);return d==1?(x%mod+mod)%mod:-1;}//��a��mod�µ���Ԫ����������Ԫ����-1����Ҫ��MODΪ����

using vi = vt<int>;
const int N = 4e5 + 5;
int  M = 1e9 + 7;

inline int add(int x, int y) { return x + y >= M ? x + y - M : x + y; }
inline int mul(int x, int y) { return x * y % M; }
inline int sub(int x, int y) { return x - y < 0 ? x - y + M : x - y; }


using G = vt<vi>;

#define mid (l+r>>1)
#define lc p<<1
#define rc lc|1
#define lson lc,l,mid
#define rson rc,mid+1,r
int f[N], vis[N],n, spcrk[N], nowrk[N];
vi use;
G Gt, spcG, h,com;
int finds(int x)
{
    return f[x] = (f[x] == x ? x : finds(f[x]));
}
bool dfs(int x, G&g)
{
    vis[x] = 1;
    for(int y : g[x])
    {
     //   cout << x << ' ' << y << ' ' << vis[y] << endl;
        if(vis[y] == 1)return false;
        else if(!vis[y] && !dfs(y, g))return false;
        //vis[x] = 2;
    }
    vis[x] = 2;
    use.eb(x);
    return true;
}
bool check(G&g)
{
    rep(i, 1, n) vis[i] = 0;
    use.clear();
    rep(i, 1, n)if(!vis[i])
    {
     //   cout << "i=" << i << endl;
        if(!dfs(i, g))return false;
    }
    reverse(all(use));
    return true;
}
bool dfs1(int x)
{
    for(int y : Gt[x])
    {
        if(nowrk[y] < nowrk[x]) return false;
        if(!dfs1(y)) return false;
    }
    return true;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int  k;
    cin >> n >> k;
    int rt = 0;
    com.resize(n + 1);
    Gt.resize(n + 1);
    spcG.resize(n + 1);
    h.resize(n + 1);
    rep(i, 1, n)
    {
        int x;
        cin >> x;
        if(x == 0) rt = i;
        f[i] = i;
        Gt[x].eb(i);
    }
    rep(i, 1, k){
        int x, y;
        cin >> x >> y;
        h[x].eb(y);
        int fx = finds(x);
        int fy = finds(y);
        if(fx != fy)
        {
            f[fx] = fy;
        }
    }

   // cout << check(h) << endl;
    if(!check(h))
    {
        cout << 0 << endl;
        return 0;
    }
    //cout << 0 << endl;
    auto use1 = use;
    for(int i = 0; i < use1.sz; i++) spcrk[use1[i]] = i;
    rep(i, 1, n)
    {
        com[finds(i)].eb(i);
    }
    rep(i, 1, n)
    {
        for(int x : Gt[i])
        {
            if(finds(x) == finds(i)) continue;
            spcG[finds(i)].eb(finds(x));
        }
    }
 //   cout << "SS" << endl;
    if(!check(spcG))
    {
        cout << 0 << endl;
        return 0;
    }
//    for(int x : use)
//    {
//       // cout << x << ' ' ;
//    }
//    //cout << endl;
    vi ans;
    for(int x : use)
    {
        //int F = finds(x);
    //    cout << x << endl;
        sort(all(com[x]),[&](int a, int b){return spcrk[a] < spcrk[b]; });
       // cout << F << endl;
        for(int y : com[x])
        {
      //      cout << y << endl;
            ans.eb(y);
        }
    }
    rep(i, 0, ans.sz - 1)
    {
        nowrk[ans[i]] = i;
    }
    if(!dfs1(rt))
    {
     //   cout << "ss" << endl;
        cout << 0 << endl;
        return 0;
    }
    for(int x : ans) cout << x << ' ';
    cout << endl;
}
