#include <bits/stdc++.h>
using namespace std;
struct caozuo
{
int gongjianhao;
int gongxu;
int jiqihao;
int jiagongshijian;
};
struct caozuo caozuos[24][24]; // caozuos[工件号][工序号]
int main()
{
int n, m; // n 工件数量,m 机器数
int shunxu[404];
cin >> m >> n;
for (int i = 0; i < m * n; i++)
{
cin >> shunxu[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
caozuos[i][j].gongjianhao = i;
caozuos[i][j].gongxu = j;
cin >> caozuos[i][j].jiqihao;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> caozuos[i][j].jiagongshijian;
}
}
int dangqiangongxu[24] = {}; // 每个工件已经安排到第几道工序
int gongjianjieshu[24] = {}; // 每个工件上一道工序完成时间
bool used[24][10005] = {}; // used[机器号][时间],表示机器某时刻是否被占用
int ans = 0;
for (int i = 0; i < m * n; i++)
{
int gongjian = shunxu[i];
dangqiangongxu[gongjian]++;
int gongxu = dangqiangongxu[gongjian];
int jiqi = caozuos[gongjian][gongxu].jiqihao;
int shijian = caozuos[gongjian][gongxu].jiagongshijian;
// 当前操作最早不能早于该工件上一道工序完成时间
int start = gongjianjieshu[gongjian];
while (true)
{
bool ok = true;
// 检查机器 jiqi 从 start 到 start + shijian - 1 是否全空
for (int t = start; t < start + shijian; t++)
{
if (used[jiqi][t])
{
ok = false;
break;
}
}
if (ok)
{
break;
}
start++;
}
// 把这段时间标记为占用
for (int t = start; t < start + shijian; t++)
{
used[jiqi][t] = true;
}
// 更新该工件完成时间
gongjianjieshu[gongjian] = start + shijian;
// 更新答案
ans = max(ans, start + shijian);
}
cout << ans << endl;
return 0;
}