#include <bits/stdc++.h>
using namespace std;
const int maxN = 500 + 5;
const int maxM = 100000 + 5;
inline long long read() {
  long long sum = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    sum = sum * 10 + ch - '0';
    ch = getchar();
  }
  return f * sum;
}
int dp[maxN][maxN];
char G[maxN][maxN];
const int dr[] = {1, 0};
const int dc[] = {0, 1};
int main() {
  ios::sync_with_stdio(false);
  int n = read(), m = read(), len = (n + m) / 2;
  for (int i = 1; i <= n; i++) scanf("%s", G[i] + 1);
  if (G[1][1] != G[n][m]) {
    printf("0\n");
    return 0;
  }
  dp[1][n] = 1;
  for (int k = 2; k <= len; k++) {
    for (int i = k; i >= 1; i--) {
      int x1 = i, y1 = 1 + k - x1;
      if (x1 > n || y1 < 1 || y1 > m) continue;
      for (int j = n - k + 1; j <= n; j++) {
        int x2 = j, y2 = n + m - k - x2 + 1;
        if (x2 < 1 || x2 > n || y2 < 1 || y2 > m)
          continue;
        else if (G[x1][y1] != G[x2][y2]) {
          dp[x1][x2] = 0;
          continue;
        }
        dp[x1][x2] = (dp[x1][x2] + dp[x1][x2 + 1]) % 1000000007;
        dp[x1][x2] = (dp[x1][x2] + dp[x1 - 1][x2]) % 1000000007;
        dp[x1][x2] = (dp[x1][x2] + dp[x1 - 1][x2 + 1]) % 1000000007;
      }
    }
  }
  int ans = 0;
  if ((n + m) % 2 == 0) {
    for (int x1 = 1; x1 <= len; x1++) {
      int y1 = 1 + len - x1;
      if (x1 >= 1 && x1 <= n && y1 >= 1 && y1 <= m)
        ans = (ans + dp[x1][x1]) % 1000000007;
    }
  } else {
    for (int x1 = 1; x1 <= len; x1++) {
      int y1 = 1 + len - x1;
      if (x1 < 1 || x1 > n || y1 < 1 || y1 > m) continue;
      if (y1 + 1 <= m) ans = (ans + dp[x1][x1]) % 1000000007;
      if (x1 + 1 <= n) ans = (ans + dp[x1][x1 + 1]) % 1000000007;
    }
  }
  printf("%d\n", ans);
  return 0;
}
