#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ll long long
#define ull unsigned long long
#define N 21
#define M 100010
using namespace std;
int m,n;
bool jiqiwork[N][M];
int shunxu[N*N];
struct rode{
int gongxu_jiqi[N];
int gongxu_shijian[N];
int last,tail;
};
rode gongjian[N];
int ans;
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m*n;i++) scanf("%d",&shunxu[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int x;
scanf("%d",&x);
gongjian[i].gongxu_jiqi[j]=x;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int x;
scanf("%d",&x);
gongjian[i].gongxu_shijian[j]=x;
}
for(int i=1;i<=m*n;i++)
{
int turn=shunxu[i];
gongjian[turn].tail++;
int tail=gongjian[turn].tail;
int jiqi=gongjian[turn].gongxu_jiqi[tail];
int shijian=gongjian[turn].gongxu_shijian[tail];
int j;
for(j=gongjian[turn].last+1;;j++)
{
if(!jiqiwork[jiqi][j])
{
if(!jiqiwork[jiqi][j+shijian-1])
{
for(int k=j;k<=j+shijian-1;k++) jiqiwork[jiqi][k]=1;
gongjian[turn].last=j+shijian-1;
break;
}
else j=j+shijian-1;
}
}
}
for(int i=1;i<=n;i++) ans=Max(ans,gongjian[i].last);
printf("%d",ans);
}