#include <bits/stdc++.h>
using namespace std;
const int INF = 1000000002;
const long long INFLL = 100000000000000000ll;
const long long MOD = 1000000007;
int B[505][505], H, W;
long long DP[2][505][505];
vector<int> di = {0, 1};
vector<int> dj = {1, 0};
int main() {
  cin >> H >> W;
  for (int i = (1); i <= (H); i++) {
    string s;
    cin >> s;
    for (int j = (1); j <= (W); j++) B[i][j] = s[j - 1] - 'a' + 1;
  }
  if (B[1][1] != B[H][W]) {
    cout << 0;
    return 0;
  }
  DP[0][1][W] = 1;
  queue<pair<pair<int, int>, pair<int, int>>> q;
  int movs = ((H - 1) + (W - 1)) / 2;
  long long ans = 0;
  for (int step = (0); step <= (movs - 1); step++) {
    int m = step % 2;
    for (int j1 = (1); j1 <= (W); j1++)
      for (int j2 = (j1); j2 <= (W); j2++) DP[1 - m][j1][j2] = 0;
    for (int j1 = (1); j1 <= (W); j1++)
      for (int j2 = (j1); j2 <= (W); j2++) {
        int i1 = step + 2 - j1;
        int i2 = H + W - step - j2;
        long long ways = DP[m][j1][j2];
        if (ways == 0) continue;
        for (int m1 = (0); m1 <= (1); m1++)
          for (int m2 = (0); m2 <= (1); m2++) {
            int ni1 = i1 + di[m1];
            int nj1 = j1 + dj[m1];
            int ni2 = i2 - di[m2];
            int nj2 = j2 - dj[m2];
            if (ni1 <= ni2 && nj1 <= nj2 && B[ni1][nj1] == B[ni2][nj2]) {
              DP[1 - m][nj1][nj2] += ways;
              DP[1 - m][nj1][nj2] %= MOD;
            }
          }
      }
  }
  for (int j1 = (1); j1 <= (W); j1++)
    for (int j2 = (j1); j2 <= (W); j2++)
      ans = (ans + DP[movs % 2][j1][j2]) % MOD;
  cout << ans;
}
