#include <bits/stdc++.h>
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x + _y;
  if (_ >= _mod) _ -= _mod;
  return _;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x - _y;
  if (_ < 0) _ += _mod;
  return _;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x * _y;
  if (_ >= _mod) _ %= _mod;
  return _;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = mul(_tmp, _tmp, _mod);
  if (_x & 1) _tmp = mul(_tmp, _a, _mod);
  return _tmp;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0ll;
  long long _tmp = mymul(_a, _x / 2, _mod);
  _tmp = add(_tmp, _tmp, _mod);
  if (_x & 1) _tmp = add(_tmp, _a, _mod);
  return _tmp;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
void build() {}
int n, m, p[101010], a[101010];
vector<int> v[101010], ans;
void init() {
  n = getint();
  m = getint();
  while (m--) {
    int pi = getint();
    int si = getint();
    p[si] = pi;
    v[pi].push_back(si);
  }
  for (int i = 1; i <= n; i++) a[i] = getint();
}
set<int> S[101010];
int no[101010];
inline void merge(int i, int j) {
  if (S[no[i]].size() < S[no[j]].size()) swap(no[i], no[j]);
  for (int x : S[no[j]]) S[no[i]].insert(x);
}
void go(int now) {
  S[no[now]].insert(a[now]);
  for (int son : v[now]) {
    go(son);
    merge(now, son);
  }
  if (S[no[now]].count(now) && S[no[now]].size() > 1) {
    puts("-1");
    exit(0);
  }
  if (S[no[now]].count(now)) {
    S[no[now]].erase(now);
    ans.push_back(now);
  }
}
void solve() {
  for (int i = 1; i <= n; i++) no[i] = i;
  for (int i = 1; i <= n; i++)
    if (!p[i]) go(i);
  printf("%d\n", (int)ans.size());
  for (size_t i = 0; i < ans.size(); i++) printf("%d\n", ans[i]);
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
