#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
const long long MOD = 1e9 + 7;
char s[maxn][maxn];
long long dp[2][maxn][maxn];
int n, m;
int main() {
  int i, j, k, tmp, o, o1, o2;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%s", s[i] + 1);
  if (s[1][1] != s[n][m]) {
    puts("0");
    return 0;
  }
  if (n > m) {
    for (i = 1; i <= n; i++)
      for (j = 1; j < i; j++) swap(s[i][j], s[j][i]);
    swap(n, m);
  }
  memset(dp, 0, sizeof(dp));
  o = (n + m) / 2;
  for (i = o; i > 0; i--) {
    o1 = i & 1, o2 = o1 ^ 1;
    for (j = i; j > 0; j--) {
      if (j > n) continue;
      for (k = n + m - i - (i - j); k >= j; k--) {
        if (k > n) continue;
        dp[o2][j][k] = 0;
        if (i == o && s[j][i - j + 1] == s[k][n + m - i - k + 1])
          dp[o2][j][k] = 1;
        else if (s[j][i - j + 1] == s[k][n + m - i - k + 1])
          dp[o2][j][k] = (dp[o1][j][k] + dp[o1][j + 1][k] + dp[o1][j][k - 1] +
                          dp[o1][j + 1][k - 1]) %
                         MOD;
      }
    }
  }
  printf("%I64d\n", dp[0][1][n]);
  return 0;
}
