#include <bits/stdc++.h>
using namespace std;
//工件
struct g{
int id;
int j[25];
int t[25];
int k=1;
int lt=0;
}a[25];
//机器
struct p{
int id;
int t[10000]={0};
}b[25];
int main(){
int m,n;
cin>>m>>n;
int xu[405];
int max=0;
for(int i=1;i<=n*m;++i)cin>>xu[i];
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>a[i].j[j];
//cout<<a[xu[i]].j[j];
}
}
//cout<<endl;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>a[i].t[j];
//cout<<a[xu[i]].t[j];
}
}
//输入完毕
int l=n*m;
for(int i=1;i<=l;++i){
//a[xu[i]]的工件
//找空b[a[xu[i]].b[k]]
// k!!!
int aa=xu[i];
int bb=a[aa].j[a[aa].k];
///cout<<aa<<" "<<bb<<endl;
int s=0;
int tt=0;
int ss=0;
for(int j=a[aa].lt;;++j){//j是机器的时间段
if(ss==0)s=j;
ss=1;
if(b[bb].t[j]==0){
tt=j-s;
}
else s=j;
///cout<<j<<" "<<tt<<endl;
if(a[aa].t[a[aa].k]==tt)//找到空位
{
for(int k=s;k<=j;++k)b[bb].t[k]=1;
a[aa].lt=j;
a[aa].k++;
if(j>max)max=j;
//cout<<"break"<<endl;
break;
}
}
}
cout<<max;
return 0;
}