#define _CRT_SECURE_NO_WARNINGS
#include <stdc++.h>
using namespace std;
int main() {
int n,m=0;
scanf("%d %d",&m,&n);
int statusId = 0;
int arr1[360]= {0};
int arr2[21][21]= {0};
int arr3[21][21]= {0};
int arr4[21]= {0};
int timeTag[21][8000]= {0};
int timeTail[8000]= {0};
int maxTime[101]= {0};
int startPt=0;
for(int i=1; i<=m*n; i++) {
scanf("%d",&arr1[i]);
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
scanf("%d",&arr2[i][j]);
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
scanf("%d",&arr3[i][j]);
}
}
for(int i=1; i<=n*m; i++) {
arr4[i] = 1;
}
int proId = 0; int prcId = 0;
for(int i=1; i<=m*n; i++) {
proId = arr1[i];
statusId = arr4[proId];
prcId = arr2[proId][statusId];
int time=arr3[proId][statusId];
for(int j=1; j<=7800; j++) {
int spaceTimeCount = 0;
int fillFlagRight,fillFlagLeft=0;
if(timeTag[prcId][j]==0) {
fillFlagLeft = j;
fillFlagRight = fillFlagLeft+spaceTimeCount;
while(timeTag[prcId][fillFlagRight]==0 && spaceTimeCount < time) {
fillFlagRight = fillFlagLeft+spaceTimeCount;
spaceTimeCount++;
}
}
if(spaceTimeCount >= time ) {
if(maxTime[proId] >= fillFlagLeft) {
fillFlagLeft = maxTime[proId];
} else {
}
for(int j=fillFlagLeft; j<time+fillFlagLeft; j++) {
timeTag[prcId][j] = proId;
}
maxTime[proId]=time+fillFlagLeft;
timeTail[prcId] = timeTail[prcId]>time+fillFlagLeft?timeTail[prcId]:time+fillFlagLeft;
arr4[proId] = arr4[proId]+1;
break;
}
}
}
int maxTail=timeTail[1];
for(int i=1; i<=n; i++) {
if(maxTail < timeTail[i]) {
maxTail = timeTail[i];
}
}
cout << maxTail-1 << " " <<endl;
system("pause");
}