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

#include <cstdio>
#include <algorithm>
#include <queue>
#include <set>

using namespace std;

int n, m;
int G[10][10];

struct state 
{
  int z[10], d;
  
  bool is_won(void) 
  {
    int i;
    
    for(i = 0; i < n; i++) if(z[i] != i) return false;
    
    return true;
  }
  
  bool operator < (const state &s) const
  {
    int i;
    
    for(i = 0; i < n; i++) 
      if(z[i] != s.z[i]) return z[i] < s.z[i];
      
    return false;
  }
};

int input(void);
void solve(void);
int BFS(void);

state start;
queue <state> Q;
set <state> U;

int main(void)
{
  input(); 
  solve();  
    
  return 0;
}

int input(void)
{
  int a, b;
  int i, j;
  
  if(scanf("%d %d", &n, &m) != 2) return 0;
  
  for(i = 0; i < 10; i++)
    for(j = 0; j < 10; j++) G[i][j] = 0;
    
  for(i = 0; i < m; i++) {
    scanf("%d %d", &a, &b); a--; b--;
    G[a][b] = G[b][a] = 1;
  }
  
  start.d = 0;
  for(i = 0; i < n; i++) {
    scanf("%d", &a); a--;
    start.z[i] = a;
  }
  
  return 1;
}

void solve(void)
{
  printf("%d\n", BFS());
}

int BFS(void)
{
  state a, b;
  int x;
  int i;
  
  if(start.is_won()) return 0;
  U.clear(); while(!Q.empty()) Q.pop();
  Q.push(start); U.insert(start);
  
  while(!Q.empty()) {
    a = Q.front(); Q.pop();
    for(i = 0; i < n; i++) if(a.z[i] == 0) break;
    x = i; b = a; b.d = a.d + 1;
    for(i = 0; i < n; i++)
      if(G[x][i] && i != x) {
        swap(b.z[x], b.z[i]);
        if(U.find(b) != U.end()) { 
          swap(b.z[x], b.z[i]); continue;
        }
        U.insert(b);
        Q.push(b);
        if(b.is_won()) return b.d;
        swap(b.z[x], b.z[i]);
      }
  }
  return -1;
}
