#include <bits/stdc++.h>
using namespace std;
int main(int argc, char* argv[]) {
  std::ios::sync_with_stdio(false);
  long long int N, M;
  cin >> N >> M;
  vector<string> strs(N);
  getline(cin, strs[0]);
  for (long long int n = 0; n < N; ++n) getline(cin, strs[n]);
  vector<int> dp[500][500];
  long long int T = N + M - 2;
  for (long long int d = T / 2; 0 <= d; --d) {
    long long int R = T - 2 * d;
    for (long long int n = 0; n < N; ++n) {
      long long int m = d - n;
      if (m < 0 || m >= M) continue;
      dp[n][m].resize(R + 1, 0);
      if (R == 0)
        dp[n][m][0] = 1;
      else if (R == 1) {
        if (n + 1 < N && strs[n][m] == strs[n + 1][m]) {
          dp[n][m][1] = 1;
        }
        if (m + 1 < M && strs[n][m] == strs[n][m + 1]) {
          dp[n][m][0] = 1;
        }
      } else {
        for (long long int dn = 0; dn <= R; ++dn) {
          long long int dm = R - dn;
          long long int n2 = n + dn;
          long long int m2 = m + dm;
          if (n2 >= N || n2 < 0 || m2 >= M || m2 < 0) continue;
          long long int tmp = 0;
          if (strs[n][m] == strs[n2][m2]) {
            if (dn && dm) tmp += dp[n + 1][m][dn - 1];
            if (dn > 1) tmp += dp[n + 1][m][dn - 2];
            if (dm > 1) tmp += dp[n][m + 1][dn];
            if (dm && dn) tmp += dp[n][m + 1][dn - 1];
          }
          dp[n][m][dn] = tmp % 1000000007LL;
        }
      }
    }
  }
  cout << dp[0][0][N - 1] << endl;
  return 0;
}
