#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const long long maxn = 555;
long long dp[2][maxn][maxn];
char str[maxn][maxn];
const long long mod = 1e9 + 7;
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) scanf("%s", str[i] + 1);
  memset(dp, 0, sizeof(dp));
  long long ans = 0;
  for (int i = 1; i <= (n + m) / 2; i++) {
    for (int j = 1; j <= n; j++)
      for (int k = 1; k <= n; k++) dp[i & 1][j][k] = 0;
    for (int j = 1; j <= n; j++) {
      for (int k = n; k >= 1; k--) {
        int y1 = i - j + 1;
        int y2 = n + m + 1 - i - k;
        if (y1 < 1 || y1 > m || y2 < 1 || y2 > m) continue;
        if (str[j][y1] != str[k][y2]) continue;
        dp[i & 1][j][k] =
            (dp[(i - 1) & 1][j][k + 1] + dp[(i - 1) & 1][j][k] +
             dp[(i - 1) & 1][j - 1][k] + dp[(i - 1) & 1][j - 1][k + 1]) %
            mod;
        if (i == 1 && j == 1 && k == n) dp[i & 1][j][k] = 1;
      }
    }
  }
  if ((n + m) & 1) {
    int t = (n + m - 1) / 2;
    t = t & 1;
    for (int i = 1; i <= n; i++)
      ans += dp[t][i][i] + dp[t][i][i + 1], ans %= mod;
  } else {
    int t = (n + m) / 2;
    t = t & 1;
    for (int i = 1; i <= n; i++) ans += dp[t][i][i], ans %= mod;
  }
  cout << ans << endl;
  return 0;
}
