# 最初のは実装も汚くTLEした # dp的にできるように再配置しよう # 辞書順最小だから前から決めていく # 斜め線上にあるアルファベットで最小のものを全部残しその次のものからも最小を選ぶ def main(): H, W = map(int, input().split()) S = [] for i in range(H): temp = input() S.append(temp) S_reorganized = [] for i in range(H+W-1): temp = '' for j in range(H+W-1): if 0 <= i-j < H and 0 <= j < W: temp += S[i-j][j] else: temp += '{' S_reorganized.append(temp) #print(S_reorganized) dp = [[0]*(H+W-1) for i in range(H+W-1)] dp[0][0] = 1 alphabets = 'abcdefghijklmnopqrstuvwxyz' ans = S_reorganized[0][0] for i in range(1, H+W-1): smallest = '{' #辞書順最悪ダミー smallest_index = [] for j in range(H+W-1): if dp[i-1][max(0, j-1)] == 1 or dp[i-1][j] == 1: if S_reorganized[i][j] == smallest: smallest_index.append(j) elif S_reorganized[i][j] < smallest: smallest = S_reorganized[i][j] smallest_index = [] smallest_index.append(j) ans += smallest for j in smallest_index: dp[i][j] = 1 #print(smallest, smallest_index) #print(dp[i]) print(ans) main()