#include<bits/stdc++.h>
#define int long long
using namespace std;
int m,n;
int a[1000],ord[100][100],tot[100],cnt;
int ti[100][100];
int fac[100][100];
int t=1;
int xtl[100][100];
struct node{
int x=0,y=0;
};
node val[25][100005];
node pos(int cn){
for (int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ord[i][j]==cn){
node p;
p.x=i;
p.y=j;
return p;
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>m>>n;
for (int i = 1;i<=m*n;i++){
cin >> a[i];
}
for (int i =1;i<=m*n;i++){
ord[a[i]][++tot[a[i]]]=++cnt;
}
for (int i = 1;i <= n;i++){
for (int j =1;j<=m;j++){
cin>>fac[i][j];
}
}
for (int i = 1;i <= n;i++){
for (int j =1;j<=m;j++){
cin>>ti[i][j];
}
}
for (int i = 1;i <= cnt;i++){
node pis = pos(i);
int xs=pis.x,ys=pis.y;
for(int j = 1;j<=100000;j++){
bool flag=1;
for(int k = j;k<=j+ti[xs][ys];k++){
if(val[fac[xs][ys]][k].x)flag=0;
}
for(int i=1;i<=ys-1;i++)
if(xtl[xs][i]>=j)
flag = 0;
if(flag){
for(int g = j; g <= ti[xs][ys]+j-1;g++)
val[fac[xs][ys]][g]=node{xs,ys};
t=max(t,ti[xs][ys]+j-1);
xtl[xs][ys]=ti[xs][ys]+j-1;
break;
}
}
}
cout<<t;
return 0;
}