#include<iostream>
using namespace std;
struct gongjian {
int jqh;//每个工件的机器编号
int sj;//每个工件每个工序的时间
}gj_sx[20][20];//定义数组
int n, m;//定义全局变量 n个工件,m个工序
int gj_gx[20];//用来记录每个工件对印的工序
int gj_last[20];//用来记录各个工件的结束时间
int apsx[400];//用来记录安排顺序//n*m=400
int jq_sj[20][8000] = { 0 };//各个机器的时间轴//全局变量自动初始化为0//20*20*20=8000
void inits() {
cin >> m >> n;
for (int i = 0; i < m * n; i++) {//输入安排顺序
cin >> apsx[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> gj_sx[i][j].jqh;//输入第i号机器的机器号
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> gj_sx[i][j].sj;//输入第i号机器的时间
}
}
for (int i = 1; i <= n; i++) {//初始化
gj_gx[i] = 1;//每个工件对应工序起始时均为1
}
}
bool judge(int bgtime, int endtime,int jqh) {
for (int i = bgtime; i <= endtime; i++) {
if (jq_sj[jqh][i] == 1) return false;//此段时间内已被占用,无法继续使用
}
return true;
}
void chuli() {
for (int i = 0; i < m * n; i++) {
int gj = apsx[i];//找到需要插入的工件
int gx = gj_gx[gj]++;//找到当前工件所在工序
int jqh = gj_sx[gj][gx].jqh;//当前工件所对应工序所对应的机器号
int sj= gj_sx[gj][gx].sj;//当前工件所对应工序所对应的时间
int begintime = gj_last[gj];//当前工序能开始的最早的时间=当前工件的最晚时间(完成时间)
while (true) {
if (judge(begintime + 1, begintime + sj,jqh)) {//若此时间段内全部为空,则进行插入操作
for (int j = begintime; j<= begintime + sj; j++) {
jq_sj[jqh][j] = 1;//标记此时间被占用
}
gj_last[gj] = begintime + sj;//更新此工件最后时间
break;
}
begintime++;//否则begintime++;继续向后寻找可用于操作开始的时间
}
}
}
int main() {
inits();//输入,初始化函数
chuli();//处理函数
int max = gj_last[1];
for (int i = 1; i <= n; i++) {//打擂台
if (max < gj_last[i])max = gj_last[i];
}
cout << max;
return 0;
}