#include <bits/stdc++.h>
using namespace std;
const long long Mod = 1000000007;
long long dp[2][502][502];
int d1x[2] = {0, -1};
int d2x[2] = {0, 1};
char s[502][502];
int n, m;
int main() {
  scanf("%d%d", &n, &m);
  getchar();
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      char tt = getchar();
      s[i][j] = tt;
    }
    getchar();
  }
  dp[0][0][n - 1] = 1;
  if (s[0][0] != s[n - 1][m - 1]) {
    puts("0");
    return 0;
  }
  int len = (m + n) / 2 - 1;
  for (int i = 1; i <= len; i++) {
    if (!((m + n) & 1) && i == len) continue;
    for (int j = 0; j <= min(i, n); j++) {
      for (int k = min(0, n - 1 - i); k < n; k++) {
        dp[i % 2][j][k] = 0;
        if (s[j][i - j] != s[k][n + m - 2 - i - k]) continue;
        for (int u = 0; u < 2; u++) {
          for (int v = 0; v < 2; v++) {
            int t1 = j + d1x[u], t2 = k + d2x[v];
            if (t1 >= 0 && t1 < n && t2 >= 0 && t2 < n)
              dp[i % 2][j][k] =
                  (dp[i % 2][j][k] + dp[(i - 1) % 2][t1][t2]) % Mod;
          }
        }
      }
    }
  }
  long long ans = 0;
  if ((n + m) & 1) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if ((i == j && len - i + 1 == m + n - 2 - len - j) ||
            (i + 1 == j && len - i == m + n - 2 - len - j)) {
          ans = (ans + dp[len % 2][i][j]) % Mod;
        }
      }
    }
  } else {
    len--;
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if ((i == j && len - i + 2 == m + n - 2 - len - j) ||
            (i + 2 == j && len - i == m + n - 2 - len - j)) {
          ans = (ans + dp[(len) % 2][i][j]) % Mod;
        } else if ((i + 1 == j && len - i + 1 == m + n - 2 - len - j) ||
                   (i - 1 == j && len - i - 1 == m + n - 2 - len - j)) {
          ans = (ans + 2 * dp[len % 2][i][j]) % Mod;
        }
      }
    }
  }
  printf("%I64d\n", ans);
  return 0;
}
