#动态规划5部曲—确定dp含义、写出递推公式、初始化、遍历、打印dp(debug)
#确定dp[i][j]含义
#dp[i][j]表示第i行第j列的格子的最小路径和
#写出递推公式
#i行j列只能从i-1行j列或者i行j-1列来
#故:dp[i][j]=min(dp[i-1][j]+cast[i][j],dp[i][j-1]+cast[i][j])
#初始化
#要对所有边界都初始化,对于只能往右和往下,最左边和最上边就是边界,也就是第一行和第一列
n,m=map(int,input().split())
cast=[[int(i) for i in input().split()] for j in range(n)]
# print(cast)
dp=[[0 for i in range(m)] for j in range(n)]
#初始化第一行
for i in range(m):
for j in range(i+1):
dp[0][i]+=cast[0][j]
#初始化第一列
for i in range(1,n):
for j in range(i+1):
dp[i][0]+=cast[j][0]
# print(dp)
#遍历
for i in range(1,n):
for j in range(1,m):
dp[i][j]=min(dp[i-1][j]+cast[i][j],dp[i][j-1]+cast[i][j])
print(dp[n-1][m-1])