#include <iostream>
#include <algorithm>
using namespace std;
const int N(25);
struct item{
int w[N];
int t[N];
int now;
int s;
};
int order[N*N]={0};
item data[N];
bool mach[N][N*N]={false};
int main()
{
for(int i=0;i<N;i++)
{
fill(data[i].w,data[i].w+N,0);
fill(data[i].t,data[i].w+N,0);
}
int m,n,ans(0);
cin>>m>>n;
for(int i=1;i<=m*n;i++)
cin>>order[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>data[i].w[j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>data[i].t[j];
for(int i=1;i<=n;i++)
data[i].now=1,data[i].s=1;
for(int i=1;i<=m*n;i++)
{
int x(order[i]),no(data[x].now),
ma(data[x].w[no]),t(data[x].t[no]),p(data[x].s);
bool find=false;
while(!find)
{
if(mach[ma][p]==false)
{
int j;
for(j=0;j<t;j++)
if(mach[ma][p+j])
break;
if(j==t)
{
for(j=0;j<t;j++)
mach[ma][p+j]=true;
data[x].now++;
data[x].s=p+j;
ans=max(ans,p+j-1);
find=true;
}
else
p=p+j;
}
else
p++;
}
}
cout<<ans<<endl;
return 0;
}
/**************************************************************
Problem: 2266
User: admin
Language: C++
Result: Accepted
Time:62 ms
Memory:2096 kb
****************************************************************/