def arrange(stuff_num, machine, needtime): #形参含义:工件序号,此轮应使用的机器,所需时间
start_search_index = last_occur_time[stuff_num]
j = 0
while 1:
for i in range(start_search_index+j,start_search_index+j+needtime):
#print("in for:{}".format(i))
if timeline[machine][i] == 1:
break
#print("out for:{}".format(i))
if i+1 == start_search_index+j+needtime:
next_seq[stuff_num]+=1
last_occur_time[stuff_num] = i+1
for i in range(start_search_index+j,start_search_index+j+needtime):
timeline[machine][i] = 1
break
else:j+=1
next_seq = [1 for i in range(22)] #下一次加工的顺序,下标从1开始
last_occur_time = [0 for i in range(22)] #最后一次出现的时间点,下标从1开始
working_seq = [[]] # working_seq[i]记录i号工件的机器号顺序,下标从1开始
need_time = [[]] # 记录方式同上,记录了所需时间
timeline = [[0 for i in range(2500)] for j in range(2500)] # timeline[i]记录第i号机器的时间线
arrange_seq = []
if __name__ == '__main__':
m, n = map(int,input().split())
arrange_seq.extend(map(int,input().split()))
for i in range(n): # insert一个无意义的数使下标从1开始,下同
alist = list(map(int,input().split()))
alist.insert(0,0)
working_seq.append(alist)
for i in range(n):
alist = list(map(int,input().split()))
alist.insert(0,0)
need_time.append(alist)
for k in arrange_seq: #在时间线上安排
arrange(k,working_seq[k][next_seq[k]],need_time[k][next_seq[k]])
ans = 0
for i in range(1,n+1):
ans = max(ans,last_occur_time[i])
print(ans)