from collections import deque H,W = map(int,input().split()) S = [] edge = [[[] for _ in range(W)] for _ in range(H)] IN = [[0] * W for _ in range(H)] flag = [[False] * W for _ in range(H)] def check(h,w): if 0 <= h < H and 0 <= w < W: return True else: return False def e(h,w,t): for dh,dw in [(-1,0),(1,0),(0,1),(0,-1)]: nh = h + dh nw = w + dw if check(nh,nw) : if flag[nh][nw]: if t == 0: edge[h][w].append((nh,nw)) IN[nh][nw] += 1 else: edge[nh][nw].append((h,w)) IN[h][w] += 1 for _ in range(H): s = list(map(lambda x:ord(x) - ord('a') ,list(input()))) S.append(s) def solve(): for i in range((H+W-2)//2 + 1): k = (H + W -2)//2 - i left = set() right = set() for h in range(max(0,k-(W-1)),min(H-1,k) + 1): w = k - h left.add(S[h][w]) rk = (H+W-2 + 1)//2 + i for h in range(max(0,rk-(W-1)),min(H-1,rk) + 1): w = rk - h right.add(S[h][w]) for h in range(max(0,k-(W-1)),min(H-1,k) + 1): w = k - h if S[h][w] in right: flag[h][w] = True e(h,w,0) for h in range(max(0,rk-(W-1)),min(H-1,rk) + 1): w = rk - h if S[h][w] in left: flag[h][w] = True e(h,w,1) solve() dp = [[0] * W for _ in range(H)] cnt = [[0] * W for _ in range(H)] dp[0][0] = 1 mod = 10 ** 9 + 7 q = deque() seen = [[False] * W for _ in range(H)] q.append((0,0)) while q: h,w = q.popleft() for nh,nw in edge[h][w]: dp[nh][nw] += dp[h][w] dp[nh][nw] %= mod if not seen[nh][nw]: q.append((nh,nw)) seen[nh][nw] = True print(dp[H-1][W-1])