import collections
import heapq
class Dijkstra:
def __init__(self):
self.e = collections.defaultdict(list)
def add(self, u, v, d, directed=False):
"""
#0-indexedでなくてもよいことに注意
#u = from, v = to, d = cost
#directed = Trueなら、有向グラフである
"""
if directed is False:
self.e[u].append([v, d])
self.e[v].append([u, d])
else:
self.e[u].append([v, d])
def delete(self, u, v):
self.e[u] = [_ for _ in self.e[u] if _[0] != v]
self.e[v] = [_ for _ in self.e[v] if _[0] != u]
def search(self, s):
"""
:param s: 始点
:return: 始点から各点までの最短経路
"""
d = collections.defaultdict(lambda: float('inf'))
d[s] = 0
q = []
heapq.heappush(q, (0, s))
v = collections.defaultdict(bool)
while len(q):
k, u = heapq.heappop(q)
if v[u]:
continue
v[u] = True
for uv, ud in self.e[u]:
if v[uv]:
continue
vd = k + ud
if d[uv] > vd:
d[uv] = vd
heapq.heappush(q, (vd, uv))
return d
R,C = map(int, input().split())
A = [list(map(int, input().split())) for i in range(R)]
B = [list(map(int, input().split())) for i in range(R-1)]
graph = Dijkstra()
#1つ目と2つ目の条件を満たす
for i in range(R):
for j in range(C-1):
graph.add(C*i+j,C*i+j+1,A[i][j],False)
#3つ目の条件を満たす
for i in range(R-1):
for j in range(C):
graph.add(C*i+j,C*(i+1)+j,B[i][j],True)
#超頂点で4つ目の条件を満たす
for i in range(R):
for j in range(C):
graph.add(C*i+j,-(C*i+j),1,True)
graph.add(-(C*(i+1)+j),-(C*i+j),1,True)
graph.add(-(C*i+j),C*i+j,0,True)
d=graph.search(0)
print(d[R*C-1])