from collections import deque
m, n = map(int, input().split())
tu = []
r = 0
for i in range(m):
lis = list(map(int, input().split()))
r = max(r, max(lis))
tu.append(lis)
b = []
for i in range(2 + m, 1 + 2 * m + 1):
b.append(input().split())
lu = 0
flag = True
for i in range(len(b)):
for j in range(n):
if b[i][j] == "1":
if flag:
x1 = i
y1 = j
flag = False
lu += 1
def bfs(mid):
q = deque([(x1, y1)])
res = 1
vis = [[0]*n for i in range(m)]
vis[x1][y1] = 1
while len(q) > 0:
x, y = q.popleft()
for i, j in [(0, -1), (0, 1), (1, 0), (-1, 0)]:
xt = x + i
yt = y + j
if 0 <= xt < m and 0 <= yt < n:
if vis[xt][yt]==0:
if abs(tu[xt][yt] - tu[x][y]) <= mid:
vis[xt][yt] = 1
q.append((xt, yt))
if b[xt][yt] == "1":
res += 1
if res == lu:
return True
return False
l = -1
r = r + 1
while l + 1 < r:
mid = (l + r) // 2
if bfs(mid):
r = mid
else:
l = mid
print(r)