#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
ostream& operator<<(ostream& out, pair<T1, T2> p) {
  return out << '(' << p.first << ", " << p.second << ')';
}
vector<string> v;
array<array<int, 500>, 500> dp, dpn;
const int mod = 1000000007;
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  srand(time(0));
  int n, m;
  cin >> n >> m;
  v.resize(n);
  for (auto& i : v) cin >> i;
  int l, r;
  if ((n + m) & 1) {
    l = (n + m - 2) / 2, r = l + 1;
    for (int i = max(0, l - (m - 1)), j = l - i; i <= min(n - 1, l); i++, j--) {
      if (i + 1 < n && v[i][j] == v[i + 1][j]) dp[i][i + 1] = 1;
      if (j + 1 < m && v[i][j] == v[i][j + 1]) dp[i][i] = 1;
    }
  } else {
    l = r = (n + m - 2) / 2;
    for (int i = max(0, l - (m - 1)), j = l - i; i <= min(n - 1, l); i++, j--)
      dp[i][i] = 1;
  }
  for (; l > 0; l--, r++) {
    for (int li = max(0, l - (m - 1)), lj = l - li; li <= min(n - 1, l);
         li++, lj--)
      for (int ri = max(0, r - (m - 1)), rj = r - ri; ri <= min(n - 1, r);
           ri++, rj--) {
        if (li - 1 >= 0 && ri + 1 < n && v[li - 1][lj] == v[ri + 1][rj])
          (dpn[li - 1][ri + 1] += dp[li][ri]) %= mod;
        if (lj - 1 >= 0 && ri + 1 < n && v[li][lj - 1] == v[ri + 1][rj])
          (dpn[li][ri + 1] += dp[li][ri]) %= mod;
        if (li - 1 >= 0 && rj + 1 < m && v[li - 1][lj] == v[ri][rj + 1])
          (dpn[li - 1][ri] += dp[li][ri]) %= mod;
        if (lj - 1 >= 0 && rj + 1 < m && v[li][lj - 1] == v[ri][rj + 1])
          (dpn[li][ri] += dp[li][ri]) %= mod;
      }
    dp = dpn, dpn = {};
  }
  cout << dp[0][n - 1] << endl;
}
