#include <bits/stdc++.h>
using namespace std;
const int MAXN = 555;
const int MOD = 1000000007;
const int MAX_LOG = 17;
const int MAGIC = 666666;
char B[1 << 15], *S = B, *T = B, ch;
int ReadInt() {
  while (ch = (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T)
                   ? 0
                   : *S++),
         !isdigit(ch))
    ;
  int aa = ch - '0';
  while (ch = (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T)
                   ? 0
                   : *S++),
         isdigit(ch))
    aa = aa * 10 + ch - '0';
  return aa;
}
int powMod(int a, int b) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = 1ll * ret * a % MOD;
    a = 1ll * a * a % MOD;
    b >>= 1;
  }
  return ret;
}
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
char buf[MAXN][MAXN];
int dp[2][MAXN][MAXN];
int N, M;
int step;
void update(int &a, int b) {
  a += b;
  while (a >= MOD) a -= MOD;
}
int dx1[2] = {0, 1}, dy1[2] = {1, 0};
int dx2[2] = {0, -1}, dy2[2] = {-1, 0};
bool judge(int x, int y) { return (0 <= x && x < N) && (0 <= y && y < M); }
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 0; i < N; ++i) scanf("%s", buf[i]);
  int len = N + M - 1;
  step = (len + 1) / 2;
  ;
  dp[0][0][N - 1] = (buf[0][0] == buf[N - 1][M - 1]);
  int cur = 0, nxt = 1;
  for (int k = 1; k < step; ++k) {
    for (int i = 0; i < N; ++i) {
      for (int j = 0; j < N; ++j) dp[nxt][i][j] = 0;
    }
    for (int i = 0; i < N; ++i) {
      int x1 = i, y1 = k - x1 - 1;
      if (0 <= y1 && y1 < M) {
        for (int j = 0; j < N; ++j) {
          int x2 = j, y2 = N + M - 1 - x2 - k;
          if (0 <= y2 && y2 < M) {
            for (int p = 0; p < 2; ++p) {
              for (int q = 0; q < 2; ++q) {
                int tx1 = x1 + dx1[p], ty1 = y1 + dy1[p];
                int tx2 = x2 + dx2[q], ty2 = y2 + dy2[q];
                if (judge(tx1, ty1) && judge(tx2, ty2) &&
                    buf[tx1][ty1] == buf[tx2][ty2]) {
                  update(dp[nxt][tx1][tx2], dp[cur][i][j]);
                }
              }
            }
          }
        }
      }
    }
    swap(cur, nxt);
  }
  int ans = 0;
  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < N; ++j) {
      int x1 = i, y1 = step - x1 - 1;
      int x2 = j, y2 = N + M - 1 - x2 - step;
      int val = abs(x1 - x2) + abs(y1 - y2);
      if (judge(x1, y1) && judge(x2, y2)) {
        if (val == 1 || val == 0) {
          update(ans, dp[cur][i][j]);
        }
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
