#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=21;
int m,n,ans,cnt;//cnt有多少机器被占用
int a[maxn],b[maxn][maxn],c[maxn][maxn];//b机器 c时间
int d[maxn],e[maxn],f[maxn];//d机器进程 e工件步骤 f机器对应工件
bool v[maxn];//v哪个工件在加工
int main()
{
cin>>m>>n;
for(int i=1;i<=m*n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>b[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
}
}
memset(e,1,sizeof(e));
ans=m*n;
for(int i=1;;i++)
{
for(int j=1;j<=m*n;j++)
{
if(cnt==m) break;
if(d[b[a[j]][e[a[j]]]]||!a[j]||v[a[j]]) continue; //以进行过或机器被占
cnt++;
e[a[j]]++;
d[b[a[j]][e[a[j]]]]=c[a[j]][e[a[j]]];
f[b[a[j]][e[a[j]]]]=a[j];
v[a[j]]=true;
}
for(int j=1;j<=m;j++)
{
if(!d[j]) continue;
d[j]--;
if(!d[j])
{
cnt--;
ans--;
v[f[j]]=false;
}
}
if(!ans)
{
cout<<i<<endl;
break;
}
}
return 0;
}