#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;
}