#include<bits/stdc++.h>
#define go(a,it,b) for(int it=a;it<=b;it++)
using namespace std;
int n,m,k=1,plan[401],t[21][21],M[21][21],go[21],remain[21],pro[21];
bool did[401];
void process(int x){
int i=k;
int id=plan[i];
while(M[id][go[id]]!=x&&i<=m*n){
i++,id=plan[i];
}
if(i==k)k++;
if(i>m*n)return;
plan[i]=0,remain[x]=t[id][go[id]],pro[x]=id;
}
bool end(){
go(1,i,m)if(remain[i])return 0;
return 1;
}
int main(){
cin>>m>>n;
go(1,i,n*m)cin>>plan[i];
go(1,i,n)go(1,j,m)cin>>M[i][j];
go(1,i,n)go(1,j,m)cin>>t[i][j];
go(1,i,n)go[i]=1;
go(1,cost,1e9){
go(1,i,m){
if(remain[i]==1)go[pro[i]]++;
if(remain[i])remain[i]--;
if(!remain[i])process(i);
}
if(end()){cout<<cost-1;return 0;}
}
}