def check(mid):
global flag_cnt,queue,visit
queue=[[x0,y0]]
dir=[[0,1],[0,-1],[-1,0],[1,0]]
visit[x0][y0]=1
while (len(queue)!=0):
a,b=queue.pop(0)
for i in range(4):
x,y=a+dir[i][0],b+dir[i][1]
if (0<=x<m and 0<=y<n):
if (visit[x][y]==1):
continue
if (abs(high[a][b]-high[x][y])>mid):
continue
visit[x][y]=1
if (flag[x][y]==1):
flag_cnt+=1
if (flag_cnt==flag_num):
return True
queue.append((x,y))
return False
m,n=map(int,input().split())
high=[list(map(int,input().split())) for i in range(m)]
flag=[list(map(int,input().split())) for i in range(m)]
visit=[[0]*n for i in range(m)]
flag_cnt=1
queue=[]
flag_num=sum(element for row in flag for element in row)
x0, y0 = next((i, j) for i in range(m) for j in range(n) if flag[i][j] == 1)
ans=1e9+1
l,r=-1,1e9+1
while (l+1<r):
mid=(l+r)//2
if (check(mid)):
r=mid
ans=min(ans,r)
else:
l=mid
queue=[]
visit=[[0]*n for i in range(m)]
flag_cnt=1
print(int(ans))