from random import seed, shuffle, randint, choice
from math import gcd
from tqdm import tqdm


def move(i, p, limit):
    i += 1
    if i == limit:
        return 0, p + 1
    return i, p


def merge(arr1, per1, arr2, per2, output=False):
    period = per1 * per2 // gcd(per1, per2)
    if not arr1 or not arr2:
        return [], period
    result = []
    i1 = i2 = p1 = p2 = 0
    while True:
        front1 = arr1[i1] + p1 * per1
        front2 = arr2[i2] + p2 * per2
        if front1 >= period or front2 >= period:
            break
        if front1 + per1 < front2:
            p1 += (front2 - front1) // per1
            continue
        if front2 + per2 < front1:
            p2 += (front1 - front2) // per2
            continue
        if front1 == front2:
            result.append(front1)
            i1, p1 = move(i1, p1, len(arr1))
            i2, p2 = move(i2, p2, len(arr2))
        elif front1 < front2:
            i1, p1 = move(i1, p1, len(arr1))
        else:
            i2, p2 = move(i2, p2, len(arr2))
    if output:
        print("Merged", arr1, per1, "and", arr2, per2, "into", result, period)
    return result, period


def findWhen(perms, index, target):
    position = index
    seen = set()
    atTarget = []
    steps = 0
    while (steps % len(perms), position) not in seen:
        if position < target:
            atTarget.append(steps)
        seen.add((steps % len(perms), position))
        position = perms[steps % len(perms)][position]
        steps += 1
    assert steps % len(perms) == 0 and position == index
    return atTarget, steps


def run(n, k, perms, aces, output=False):
    cards = list(range(n))
    periods = {}
    for index in range(n):
        atTarget, steps = findWhen(perms, index, len(aces))
        if output:
            print(index, "repeating after", steps // k, "periods")
        periods.setdefault(steps // k, []).append(index)
    goodSteps = [findWhen(perms, start, len(aces)) for start in aces]
    result = goodSteps[0]
    for i in range(1, len(goodSteps)):
        result = merge(*result, *goodSteps[i], output=output)
    if output:
        print("Result", result)
    return result, periods


steps = 24067258828 * 41 + 19
print("Answer should be", steps)

with open("karty.in") as f:
    N, K = [int(x) for x in next(f).split()]
    newperms = [[int(x) for x in next(f).split()] for i in range(K)]
    newaces = [int(x) for x in next(f).split()]
    print(run(N, K, newperms, newaces))
    #print(run(N, K, newperms, newaces, output=True))  # for more tracing output