#include <bits/stdc++.h>
using namespace std;
int Dp[2][501][502];
char a[501][501];
int MO = 1000000007;
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) cin >> a[i][j];
  if (a[1][1] != a[n][m]) {
    cout << 0;
    return 0;
  }
  Dp[0][1][n] = 1;
  int x1, x2, y1, y2;
  int step = (n + m - 2) / 2;
  for (int k = 1; k <= step; k++) {
    for (int i = 1; i <= k + 1; i++)
      for (int j = n; j >= n - k && j >= i; j--) {
        x1 = i;
        y1 = k - i + 2;
        x2 = j;
        y2 = m + n - k - j;
        if (y1 > y2) continue;
        if (a[x1][y1] == a[x2][y2]) {
          Dp[k % 2][i][j] = (Dp[k % 2][i][j] + Dp[(k + 1) % 2][i][j]) % MO;
          Dp[k % 2][i][j] =
              (Dp[k % 2][i][j] + Dp[(k + 1) % 2][i - 1][j + 1]) % MO;
          Dp[k % 2][i][j] = (Dp[k % 2][i][j] + Dp[(k + 1) % 2][i - 1][j]) % MO;
          Dp[k % 2][i][j] = (Dp[k % 2][i][j] + Dp[(k + 1) % 2][i][j + 1]) % MO;
        }
      }
    memset(Dp[(k + 1) % 2], 0, sizeof(Dp[(k + 1) % 2]));
  }
  int ans = 0;
  if ((n + m) % 2 == 0) {
    for (int i = 1; i <= n; i++) ans = (ans + Dp[step % 2][i][i]) % MO;
  } else {
    for (int i = 1; i <= n; i++) {
      ans = (ans + Dp[step % 2][i][i]) % MO;
      ans = (ans + Dp[step % 2][i][i + 1]) % MO;
    }
  }
  cout << ans;
  return 0;
}
