#include<iostream>
using namespace std;
int m, n;
typedef struct order {
int number;
int time;
}order;
typedef struct workpiece {
int step = 1;
order* orders = new order[m];
int working = 0;
}workpiece;
typedef struct machine {
int working = 0;
int number;
int time = 0;
}machine;
int main() {
cin >> m >> n;
int* kk = new int[m * n + 1];
for (int i = 1; i <= m * n; i++) {
cin >> kk[i];
}
workpiece* workpieces = new workpiece[n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> workpieces[i].orders[j].number;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> workpieces[i].orders[j].time;
}
}
machine* machines = new machine[m+1];
int Time = 0;
int flag = 1;
while (flag) {
for (int i = 1; i <= n*m; i++) {
if (kk[i] != 0 && workpieces[kk[i]].working == 0 && machines[workpieces[kk[i]].orders[workpieces[kk[i]].step].number].working == 0) {
machines[workpieces[kk[i]].orders[workpieces[kk[i]].step].number].time = workpieces[kk[i]].orders[workpieces[kk[i]].step].time;
machines[workpieces[kk[i]].orders[workpieces[kk[i]].step].number].number = i;
machines[workpieces[kk[i]].orders[workpieces[kk[i]].step].number].working = 1;
workpieces[kk[i]].working = 1;
}
}
Time++;
for (int j = 1; j <= m; j++) {
if (machines[j].time != 0 && machines[j].working == 1) {
machines[j].time--;
}
if (machines[j].time == 0 && machines[j].working == 1) {
machines[j].working = 0;
workpieces[kk[machines[j].number]].step++;
workpieces[kk[machines[j].number]].working = 0;
kk[machines[j].number] = 0;
}
}
int sum = 0;
for (int i = 1; i <= n * m; i++) {
sum += kk[i];
}
for (int i = 1; i <= n * m; i++) {
if (kk[i] == 0)
flag = 0;
else
flag = 1;
}
}
cout << Time;
return 0;
}