#include <bits/stdc++.h>
const double pi = acos(-1.0);
const double eps = 1e-9;
using namespace std;
const long long MOD = 1e9 + 7;
long long mult(long long x, long long y) {
  x %= MOD;
  y %= MOD;
  return x * y % MOD;
}
long long bin_pow(long long x, long long n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = mult(res, x);
    n >>= 1;
    x = mult(x, x);
  }
  return res;
}
void add(long long &x, long long y) { x = (x + y) % MOD; }
long long sub(long long x, long long y) {
  x -= y;
  if (x < 0) x += MOD;
  return x;
}
const int N = 5e2 + 10;
long long dp[2][N][N];
string s[N];
int n, m;
void solve() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  dp[0][n - 1][m - 1] = (s[0][0] == s[n - 1][m - 1]);
  long long res = 0;
  for (int x1 = 0; x1 < n; x1++) {
    for (int x2 = n - 1; x2 >= 0; x2--) {
      for (int y2 = m - 1; y2 >= 0; y2--) {
        int y1 = n + m - x1 - x2 - y2 - 2;
        if (y1 < 0 || y1 >= m) {
          continue;
        }
        if (abs(x1 - x2) + abs(y1 - y2) <= 1 && x1 <= x2 && y1 <= y2) {
          add(res, dp[0][x2][y2]);
        }
        if (x1 + 1 < n && x2 > 0 && s[x1 + 1][y1] == s[x2 - 1][y2])
          add(dp[1][x2 - 1][y2], dp[0][x2][y2]);
        if (x1 + 1 < n && y2 > 0 && s[x1 + 1][y1] == s[x2][y2 - 1])
          add(dp[1][x2][y2 - 1], dp[0][x2][y2]);
        if (y1 + 1 < m && y2 > 0 && s[x1][y1 + 1] == s[x2][y2 - 1])
          add(dp[0][x2][y2 - 1], dp[0][x2][y2]);
        if (y1 + 1 < m && x2 > 0 && s[x1][y1 + 1] == s[x2 - 1][y2])
          add(dp[0][x2 - 1][y2], dp[0][x2][y2]);
      }
    }
    for (int x2 = 0; x2 < n; x2++) {
      for (int y2 = 0; y2 < m; y2++) {
        dp[0][x2][y2] = dp[1][x2][y2];
        dp[1][x2][y2] = 0;
      }
    }
  }
  cout << res << endl;
}
int main() {
  ios::sync_with_stdio(NULL), cin.tie(0), cout.tie(0);
  cout.setf(ios::fixed), cout.precision(7);
  int step = 1;
  for (int i = 1; i <= step; i++) {
    solve();
  }
}
