#include <bits/stdc++.h>
using namespace std;
const int maxn = 520;
const int mod = (int)(1e9 + 7 + 0.1);
int n, m;
long long ans;
char mp[maxn][maxn];
long long dp[2][maxn][maxn];
int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
bool judge(int x, int y) {
  if (x < 0 || x >= n) return false;
  if (y < 0 || y >= m) return false;
  return true;
}
void solve() {
  ans = 0;
  memset(dp, 0, sizeof(dp));
  int now = 0, la = 1;
  int len = (m + n) / 2;
  dp[now][0][n - 1] = (mp[0][0] == mp[n - 1][m - 1] ? 1 : 0);
  for (int i = 1; i < len; i++) {
    now ^= 1, la ^= 1;
    for (int k = 0; k < n; k++)
      for (int j = 0; j < n; j++) dp[now][k][j] = 0;
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++) {
        int px = j;
        int py = i - j;
        int qx = k;
        int qy = m + n - k - i - 2;
        if (!judge(px, py)) continue;
        if (!judge(qx, qy)) continue;
        if (mp[px][py] != mp[qx][qy]) continue;
        for (int p = 0; p < 2; p++)
          for (int q = 2; q < 4; q++) {
            int tpx = px + dir[p][0];
            int tpy = py + dir[p][1];
            int tqx = qx + dir[q][0];
            int tqy = qy + dir[q][1];
            if (!judge(tpx, tpy)) continue;
            if (!judge(tqx, tqy)) continue;
            if (mp[tpx][tpy] != mp[tqx][tqy]) continue;
            dp[now][px][qx] += dp[la][tpx][tqx];
            dp[now][px][qx] %= mod;
          }
      }
  }
  for (int i = 0; i < n; i++) {
    ans += dp[now][i][i];
    ans %= mod;
  }
  if (2 * len != m + n) {
    for (int i = 0; i < n - 1; i++) {
      ans += dp[now][i][i + 1];
      ans %= mod;
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> mp[i];
  solve();
  cout << ans << endl;
  return 0;
}
