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

#include<stdio.h>
#define LIM 9
int x,y,z,d,n,m,fact[10]={0,1,2,6,24,120,720,5040,40320,362880},a,b;
int start, end, masiv[10];
//0! go priemame za 0 za celite na zadachata
//inache e 1
//Momchile, stiga si si chel source-ovete, seriozno
//nai-mnogo da ti dokarat shizofreniq
int grr[9][9];
short queue[362890][LIM];
int level[362890];
bool used[362890];

void input()
{
scanf("%d%d",&n,&m);
for(x=0;x<m;x++)
{
scanf("%d%d",&a,&b);
grr[a-1][b-1]=1;
grr[b-1][a-1]=1;
}
for(x=0;x<n;x++)
{
scanf("%d",&queue[0][x]);
queue[0][x]--;
}
return;
}


int main()
{
input();
//bfs:
start=0;
end=1;
level[start]=0;
a=0;
for(x=0;x<n;x++)
masiv[x]=x;
for(x=0;x<n-1;x++)
a+=fact[n-1-x]*masiv[queue[start][x]];
for(y=masiv[x]+1;y<n;y++)
masiv[y]--;
used[a]=1;

while(start<end)
{

for(x=0;x<n;x++)
if(queue[start][x]!=x)
break;

if(x==n)
{
printf("%d\n",level[start]);
return 0;
}


               //neighbours
               for(x=0;x<n;x++)
               if(queue[start][x]==0)
               break;
               for(y=0;y<n;y++)
               if(grr[x][y]&&x!=y)
               {
               for(z=0;z<n;z++)
                              {
                              queue[end][z]=queue[start][z];
                              if(z==y)queue[end][z]=0;
                              if(z==x)queue[end][z]=queue[start][y];
                              }
               level[end]=level[start]+1;
               a=0;
               for(d=0;d<n;d++)
               masiv[d]=d;
               for(d=0;d<n-1;d++)
               a+=fact[n-1-d]*masiv[queue[end][d]];
               for(z=masiv[d]+1;z<n;z++)
               masiv[z]--;
               if(used[a]==0)
                             {
                             end++;
                             used[a]=1;
                             }
               }

start++;
}
printf("-1\n");
return 0;
}
