#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const long long int INFLL = 1e18;
const double EPS = 1e-8;
template <class T>
T &chmin(T &a, const T &b) {
  return a = min(a, b);
}
template <class T>
T &chmax(T &a, const T &b) {
  return a = max(a, b);
}
long long int in() {
  long long int a;
  cin >> a;
  return a;
}
const int MOD = 1e9 + 7;
struct Mod {
  long long int n;
  Mod() {}
  Mod(long long int n) : n((n % MOD + MOD) % MOD) {}
};
Mod operator+(Mod a, Mod b) { return Mod((a.n + b.n) % MOD); }
Mod operator+=(Mod &a, Mod b) { return a = a + b; }
Mod operator-(Mod a, Mod b) { return Mod((a.n + MOD - b.n) % MOD); }
Mod operator-=(Mod &a, Mod b) { return a = a - b; }
Mod operator*(Mod a, Mod b) { return Mod((a.n * b.n) % MOD); }
Mod operator*=(Mod &a, Mod b) { return a = a * b; }
Mod modpow(Mod x, long long int k) {
  Mod res = 1;
  while (k) {
    if (k & 1) res *= x;
    k /= 2;
    x *= x;
  }
  return res;
}
Mod inv(Mod a) { return modpow(a, MOD - 2); }
Mod operator/(Mod a, Mod b) { return Mod((a.n * inv(b).n) % MOD); }
Mod operator/=(Mod &a, Mod b) { return a = a / b; }
const int MAX_N = 512;
int n, m;
string ts[MAX_N];
int s[MAX_N][MAX_N];
long long int dp[2][MAX_N][MAX_N];
int main() {
  cin >> n >> m;
  for (int i = (0); i < (int)(n); i++) cin >> ts[i];
  if (n < m) {
    for (int i = (0); i < (int)(n); i++)
      for (int j = (0); j < (int)(m); j++) s[i][j] = ts[i][j] - 'a';
  } else {
    for (int i = (0); i < (int)(m); i++)
      for (int j = (0); j < (int)(n); j++) s[i][j] = ts[j][i] - 'a';
    swap(n, m);
  }
  dp[0][0][0] = 1;
  if (s[0][0] != s[n - 1][m - 1]) dp[0][0][0] = 0;
  int ni, nj, nk, l, o;
  for (int i = (0); i < (int)((n + m) / 2 - 1); i++) {
    for (int j = (0); j < (int)(min(i + 2, n)); j++)
      for (int k = (0); k < (int)(min(i + 2, n)); k++)
        dp[(i + 1) & 1][j][k] = 0;
    for (int j = (0); j < (int)(min(i + 1, n)); j++) {
      for (int k = (0); k < (int)(min(i + 1, n)); k++) {
        for (l = 0; l < 2; l++) {
          for (o = 0; o < 2; o++) {
            ni = i + 1;
            nj = j + l;
            nk = k + o;
            if (nj >= n || nk >= n) continue;
            if (s[nj][ni - nj] == s[n - 1 - nk][m - 1 - ni + nk]) {
              dp[ni & 1][nj][nk] += dp[i & 1][j][k];
              dp[ni & 1][nj][nk] %= MOD;
            }
          }
        }
      }
    }
  }
  int t = (m + n) / 2 - 1;
  Mod ans = 0;
  if ((n + m) % 2 == 0) {
    for (int i = (0); i < (int)(n); i++) ans += dp[t & 1][i][n - 1 - i];
  } else {
    for (int i = (0); i < (int)(n); i++) {
      for (int j = (0); j < (int)(2); j++) {
        int k = (n - i - 1) - j;
        if (k < 0) continue;
        if (s[i][t - i] == s[i + j][t - i + 1 - j]) ans += dp[t & 1][i][k];
      }
    }
  }
  cout << ans.n << endl;
  return 0;
}
