#include<bits/stdc++.h>
using namespace std;
/*inline int read()
{
int s=0,d=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') d=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){s=s*10+ch-48;ch=getchar();}
return s*d;
}*/
struct machine11{
int jiqi,shijian;
}gongjian[1005][1005];//每一行是每个工件,每一列是第i个工序(机器,时间)
int main() //第i个工件第j个工序的机器和时间;
{
int m,n;
int shunxv[1000];
cin>>m;
cin>>n;
int machine[m][9000];//如果不用动态数组就全是0,为啥
memset(machine,0,sizeof(machine));
for(register int i=1;i<=m*n;i++){
cin>>shunxv[i];
}
for(register int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin>>gongjian[i][j].jiqi;
}
for(register int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin>>gongjian[i][j].shijian;
}
//读入
int lsp=0,ans=0;
int gongxv2[1005]={1};
for(int i=1;i<=n*m;i++){
int now=shunxv[i];
int jiqi2,shijian2;
jiqi2=gongjian[now][gongxv2[now]].jiqi;
shijian2=gongjian[now][gongxv2[now]].shijian;
for(int i=1;i<=1000;i++)
{
if(machine[jiqi2][i]==0)lsp++;
if(lsp<shijian2&&machine[jiqi2][i+1]!=0) lsp=0;
else if(lsp==shijian2)
{
for(int j=gongjian[now][gongxv2[now-1]].shijian;j<=shijian2;i++)machine[jiqi2][j]=1;
lsp=0;
break;
}
}
gongxv2[now]++;
}
for(int i=1;i<=m;i++)
{ int aaa=ans;
for(int j=1;j<=100;j++)if(machine[i][j]==1)ans=j;
ans=max(ans,aaa);
}
cout<<ans;
return 0;
}