#include <bits/stdc++.h>
using namespace std;
const int N = 100001;
int n, m, ind[N], dpth[N], s[N], e[N], t, seg[4 * N], lazy[4 * N], a[N];
vector<vector<int> > g, gift;
vector<pair<int, int> > anc;
vector<int> ans, root;
void dfs(int u) {
  s[u] = t++;
  for (int i = 0; i < g[u].size(); i++) {
    dpth[g[u][i]] = dpth[u] + 1;
    dfs(g[u][i]);
  }
  e[u] = t - 1;
}
void dfs2(int u) {
  if (gift[a[u]].empty()) {
    anc.push_back(make_pair(-dpth[a[u]], a[u]));
  }
  gift[a[u]].push_back(u);
  for (int i = 0; i < g[u].size(); i++) dfs2(g[u][i]);
}
void checkLazy(int p, int s, int e) {
  if (lazy[p] != 0) {
    seg[p] += (e - s + 1) * lazy[p];
    if (s != e) lazy[2 * p] += lazy[p], lazy[2 * p + 1] += lazy[p];
    lazy[p] = 0;
  }
}
void build(int p, int s, int e) {
  if (s == e) {
    seg[p] = 1;
    lazy[p] = 0;
    return;
  }
  build(2 * p, s, (s + e) / 2);
  build(2 * p + 1, (s + e) / 2 + 1, e);
  seg[p] = seg[2 * p] + seg[2 * p + 1];
  lazy[p] = lazy[2 * p] + lazy[2 * p + 1];
}
void update(int p, int s, int e, int a, int b, int v) {
  checkLazy(p, s, e);
  if (s >= a && e <= b) {
    seg[p] += (e - s + 1) * v;
    if (s != e) lazy[2 * p] += v, lazy[2 * p + 1] += v;
    return;
  }
  if (s > b || e < a) return;
  update(2 * p, s, (s + e) / 2, a, b, v);
  update(2 * p + 1, (s + e) / 2 + 1, e, a, b, v);
  seg[p] = seg[2 * p] + seg[2 * p + 1];
}
int get(int p, int s, int e, int a) {
  checkLazy(p, s, e);
  if (s == e) return seg[p];
  if (a <= (s + e) / 2) return get(2 * p, s, (s + e) / 2, a);
  return get(2 * p + 1, (s + e) / 2 + 1, e, a);
}
int main() {
  std::ios::sync_with_stdio(false);
  scanf("%d%d", &n, &m);
  g.resize(n);
  memset(ind, 0, sizeof(ind));
  build(1, 0, n - 1);
  for (int i = 0, a, b; i < m; i++) {
    scanf("%d%d", &a, &b);
    a--, b--;
    g[a].push_back(b);
    ind[b]++;
  }
  for (int i = 0; i < n; i++)
    if (ind[i] == 0) root.push_back(i);
  for (int i = 0; i < n; i++) {
    scanf("%d", a + i);
    a[i]--;
  }
  t = 0;
  gift.resize(n);
  for (int i = 0; i < root.size(); i++) {
    int r = root[i];
    dpth[r] = 0;
    dfs(r);
    anc.clear();
    dfs2(r);
    sort(anc.begin(), anc.end());
    for (int j = 0; j < anc.size(); j++) {
      for (int k = 0; k < gift[anc[j].second].size(); k++)
        if (get(1, 0, n - 1, s[gift[anc[j].second][k]]) <= 0) {
          puts("-1");
          return 0;
        }
      ans.push_back(anc[j].second + 1);
      update(1, 0, n - 1, s[anc[j].second], e[anc[j].second], -1);
    }
  }
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++) printf("%d\n", ans[i]);
  return 0;
}
