/*
TASK: move
LANG: C++
*/

#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

const int MAX_N = 11;
const int INF   = 1000000;

struct elem {
	vector<int> P;
	int cnt;
	elem () {}
	elem (vector<int> &_P, int _cnt) : P(_P), cnt(_cnt) { }	
};

int n, m;
bool A[MAX_N][MAX_N];
vector<int> final;

int fact[MAX_N];
bool V[400000];

int ans=INF;

void input ()
{
	int i, a, b;
	
	scanf ("%d%d", &n, &m);	
	
	for (i=0; i<m; i++) {
		scanf ("%d%d", &a, &b);
		--a; --b;
		A[a][b] = A[b][a] = 1;
	}

	for (i=0; i<n; i++) {
		scanf ("%d", &a);
		--a;
		final.push_back(a);
	}
}

void init ()
{
	int i;
	
	fact[0] = 1;
	
	for (i=1; i<=n; i++)
		fact[i] = fact[i-1]*i;
}

int code (vector<int> &P)
{
	int i, j, c=0, p;
	
	for (i=0; i<n; i++) {
		p=0;
		for (j=i+1; j<n; j++) if (P[j]<P[i]) p++;
		c += p*fact[n-i-1];
	}
		
	return c;
}
/*
void dfs (vector<int> P, int cnt)
{
	int p = code(P);
	for (int qq=0; qq<n; qq++) printf ("%d ", P[qq]);
	printf ("  -->  %d\n", p);
		
	if (V[p]) return;
	V[p]=1;
	if (p==0) { ans=cnt; return; }
	
	int i, pos, next;
	
	for (i=0; i<n; i++) if (P[i]==0) { pos=i; break; }

	for (i=0; i<n; i++) {
		if (A[pos][i]) {
			swap(P[pos],P[i]);
			dfs (P,cnt+1);
			swap(P[pos],P[i]);
		}
	}
}
*/

void bfs ()
{
	int i, pos, c;
	queue<elem> Q;
	elem t;
	
	Q.push(elem(final,0));
	V[code(final)]=1;
	
	while(!Q.empty()) {
		t = Q.front(); Q.pop();
		if (code(t.P) == 0) {
			printf ("%d\n", t.cnt);
			return;	
		}
		
		for (i=0; i<n; i++) if (t.P[i]==0) { pos=i; break; }
		
		for (i=0; i<n; i++)
			if (A[pos][i]) {
				swap(t.P[pos],t.P[i]);
				c = code(t.P);
				if (!V[c]) {
					V[c] = 1;
					Q.push(elem(t.P,t.cnt+1));
				}
				swap(t.P[pos],t.P[i]);
			}
	}
	
	printf ("-1\n");
}

int main ()
{
	//freopen ("move.in", "r", stdin);
	
   input ();
   init ();
   bfs();
	
	return 0;
}
