#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
char maz[505][505];
int dp[10][505][505];
inline void cm(int& x) {
  if (x >= mod) x -= mod;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%s", maz[i] + 1);
  int up = (n + m - 1) / 2;
  if (maz[1][1] != maz[n][m]) {
    puts("0");
    return 0;
  }
  dp[0][1][m] = 1;
  for (int i = 0; i < up; ++i) {
    int ni = (i + 1) & 1, li = i & 1;
    memset(dp[ni], 0, sizeof(dp[ni]));
    for (int j = 1; j <= m; ++j) {
      int y1 = i + 2 - j;
      if (y1 < 1 || y1 > n) continue;
      for (int k = m; k >= 1; --k) {
        int y2 = n + m - i - k;
        if (y2 < 1 || y2 > n || maz[y1][j] != maz[y2][k]) continue;
        if (y1 < n && y2 > 1 && maz[y1 + 1][j] == maz[y2 - 1][k])
          dp[ni][j][k] += dp[li][j][k];
        if (y1 < n && k > 1 && maz[y1 + 1][j] == maz[y2][k - 1])
          dp[ni][j][k - 1] += dp[li][j][k];
        if (j < m && y2 > 1 && maz[y1][j + 1] == maz[y2 - 1][k])
          dp[ni][j + 1][k] += dp[li][j][k];
        if (j < m && k > 1 && maz[y1][j + 1] == maz[y2][k - 1])
          dp[ni][j + 1][k - 1] += dp[li][j][k];
        cm(dp[ni][j][k]);
        cm(dp[ni][j][k - 1]);
        cm(dp[ni][j + 1][k]);
        cm(dp[ni][j + 1][k - 1]);
      }
    }
  }
  int ans = 0;
  if ((n + m - 1) % 2) {
    for (int i = 1; i <= n; ++i) {
      ans += dp[up & 1][up + 2 - i][up + 2 - i];
      cm(ans);
    }
  } else {
    up--;
    for (int i = 1; i <= n; ++i) {
      ans += dp[up & 1][up + 2 - i][up + 3 - i];
      cm(ans);
      ans += dp[up & 1][up + 2 - i][up + 2 - i];
      cm(ans);
    }
  }
  printf("%d\n", ans);
}
