#include <bits/stdc++.h>   using namespace std;   int MOD = 1e9 + 7;   const long double E = 1e-9;   unsigned char ccc;   bool _minus = false;   inline void read(int &n) {     n = 0;     _minus = false;     while (true) {       ccc = getchar();       if (ccc ==     || ccc ==   n ) break;       if (ccc ==  - ) {         _minus = true;         continue;       }       n = n * 10 + ccc -  0 ;     }     if (_minus) n *= -1;   }   char wwww[12];   int kkkk;   inline void write(int x) {     kkkk = 0;     if (!x)       ++kkkk, wwww[kkkk] =  0 ;     else       while (x) {         ++kkkk;         wwww[kkkk] = char(x % 10 +  0 );         x /= 10;       }     for (int i = kkkk; i >= 1; --i) putchar(wwww[i]);     putchar(  n );   }   template <typename T>   inline T sqr(T t) {     return t * t;   }   struct segment_tree {    private:     int *t, n;     void build(int v, int l, int r) {       t[v] = INT_MAX;       if (l == r) {         return;       }       int x = (l + r) >> 1;       build(v << 1, l, x);       build(v << 1 | 1, x + 1, r);     }     int get_min(int v, int tl, int tr, int l, int r) {       if (l <= tl && tr <= r) return t[v];       if (tr < l || r < tl) return INT_MAX;       int x = (tl + tr) >> 1;       return min(get_min(v << 1, tl, x, l, r),                  get_min(v << 1 | 1, x + 1, tr, l, r));     }     void upd(int v, int l, int r, int pos, int val) {       if (l == r) {         t[v] = val;         return;       }       int x = (l + r) >> 1;       if (pos <= x)         upd(v << 1, l, x, pos, val);       else         upd(v << 1 | 1, x + 1, r, pos, val);       t[v] = min(t[v << 1], t[v << 1 | 1]);     }       public:     segment_tree(int n) {       t = new int[n << 2];       this->n = n;       build(1, 0, n - 1);     }     void upd(int pos, int val) { upd(1, 0, n - 1, pos, val); }     int get_min(int l, int r) {       if (r < l) return INT_MAX;       return get_min(1, 0, n - 1, l, r);     }   };   const int MAX = 1e5 + 14;   vector<int> vec[MAX];   bool is_root[MAX];   int n, m;   int present[MAX];   int parent[MAX];   vector<int> ans;   int timer = 0;   int tin[MAX], tout[MAX], h[MAX];   bool added[MAX], need_add[MAX];   segment_tree *tree;   bool now[MAX];   void add(int pos) {     if (!added[pos]) {       added[pos] = true;       ans.push_back(pos);     }   }   vector<int> q;   bool are_needed[MAX];   int where[MAX];   void dfs1(int pos, int hh) {     for (int i = 0; i < (int)vec[pos].size(); i++) dfs1(vec[pos][i], hh + 1);     if (are_needed[pos]) {       where[pos] = q.size();       q.push_back(pos);       ans.push_back(pos);     }   }   void sorry() {     cout << -1 <<   n ;     exit(0);   }   set<pair<int, int> > w;   void dfs2(int pos) {     if (are_needed[pos]) {       w.insert(make_pair(where[pos], pos));     }     for (int i = 0; i < (int)vec[pos].size(); i++) dfs2(vec[pos][i]);     if (w.empty()) sorry();     if (w.begin()->second != present[pos]) sorry();     if (are_needed[pos]) {       ::w.erase(make_pair(where[pos], pos));     }   }   int main() {     cout.precision(3);     cout << fixed;     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     ;     srand(time(NULL));     cin >> n >> m;     for (int i = 1; i <= n; i++) is_root[i] = true;     for (int i = 0; i < m; i++) {       int a, b;       cin >> a >> b;       vec[a].push_back(b);       parent[b] = a;       is_root[b] = false;     }     for (int i = 1; i <= n; i++) {       cin >> present[i];       are_needed[present[i]] = true;     }     for (int i = 1; i <= n; i++) {       if (is_root[i]) {         timer = 0;         dfs1(i, 1);         dfs2(i);       }     }     cout << ans.size() <<   n ;     for (int i = 0; i < (int)ans.size(); i++) cout << ans[i] <<   n ;   }