import sys
import copy
input = sys.stdin.readline
n , m , k = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
smell_board = [[[0 , 0] for _ in range(n)] for _ in range(n)]
currentDirection = [0] + list(map(int, input().split()))
dirRank = [[[0] , [0] , [0] , [0] , [0]] for _ in range(m + 1)]
sharkPos = [[0 , 0] for _ in range(m + 1)]
dx = [0 , 0 , 0 , -1 , 1]
dy = [0 , -1 , 1 , 0 , 0]
for i in range(1 , m + 1):
for j in range(1 , 5):
dirRank[i][j] = [0] + list(map(int, input().split()))
for i in range(n):
for j in range(n):
if board[i][j] > 0:
sharkPos[board[i][j]] = [i , j]
round = 0
curMaxShark = m
for i in range(1 , m + 1):
smell_board[sharkPos[i][0]][sharkPos[i][1]] = [i , k]
def getDirection(shark_num , curY , curX):
for i in range(1 , 5):
ny = curY + dy[dirRank[shark_num][currentDirection[shark_num]][i]]
nx = curX + dx[dirRank[shark_num][currentDirection[shark_num]][i]]
if nx < 0 or ny < 0 or nx > n - 1 or ny > n - 1:
continue
if smell_board[ny][nx][1] == 0:
currentDirection[shark_num] = dirRank[shark_num][currentDirection[shark_num]][i]
return [ny , nx]
else:
for i in range(1 , 5):
ny = curY + dy[dirRank[shark_num][currentDirection[shark_num]][i]]
nx = curX + dx[dirRank[shark_num][currentDirection[shark_num]][i]]
if nx < 0 or ny < 0 or nx > n - 1 or ny > n - 1:
continue
if smell_board[ny][nx][0] == shark_num:
currentDirection[shark_num] = dirRank[shark_num][currentDirection[shark_num]][i]
return [ny , nx]
while True:
next_round_board = [[0] * n for _ in range(n)]
for i in range(1 , m + 1):
if sharkPos[i][0] == -1 and sharkPos[i][1] == -1:
continue
[ny , nx] = getDirection(i , sharkPos[i][0] , sharkPos[i][1])
if next_round_board[ny][nx] == 0:
next_round_board[ny][nx] = i
sharkPos[i][0] , sharkPos[i][1] = ny , nx
elif 0 < next_round_board[ny][nx] < i:
sharkPos[i][0] , sharkPos[i][1] = -1 , -1
for i in range(n):
for j in range(n):
if smell_board[i][j][0] > 0:
smell_board[i][j][1] -= 1
if smell_board[i][j][1] == 0:
smell_board[i][j][0] = 0
for i in range(1 , m + 1):
if sharkPos[i][0] != -1:
smell_board[sharkPos[i][0]][sharkPos[i][1]] = [i , k]
round += 1
finished = 1
if round > 1000:
print(-1)
break
for i in range(n):
for j in range(n):
if next_round_board[i][j] > 1:
finished = 0
if finished:
print(round)
break