#include <bits/stdc++.h>
using namespace std;
const int N = 500 + 7;
const int M = N * 2;
const int inf = 1e9 + 7;
const long long base = 1e18;
const double pi = acos(-1);
const double ep = 1e-9;
string s[N];
int n, m;
int pos[N][N];
int cur[M][M], pre[M][M];
bool isValid(int u, int v) { return (u >= 1 && u <= n && v >= 1 && v <= m); }
pair<int, int> get(int k, int t) {
  t++;
  if (k <= m) {
    return make_pair(t, k + 1 - t);
  } else {
    return make_pair(k - m + t, k + 1 - (k - m + t));
  }
}
int cnt[M];
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
  }
  if (s[0][0] != s[n - 1][m - 1]) {
    cout << 0;
    return 0;
  }
  int k = n + m - 1;
  for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < m + 1; j++) {
      pos[i][j] = cnt[i + j - 1]++;
    }
  }
  cur[0][0] = 1;
  for (int len = 2; len < ((k + 1) / 2) + 1; len++) {
    for (int u = 0; u < cnt[len - 1]; u++)
      for (int v = 0; v < cnt[len - 1]; v++) {
        pre[u][v] = cur[u][v];
        cur[u][v] = 0;
      }
    for (int sl = 0; sl < cnt[len]; sl++) {
      pair<int, int> _xx = get(len, sl);
      int i = _xx.first;
      int j = _xx.second;
      int t = k - (i + j - 1) + 1;
      if (!isValid(i, j)) {
        cout << i << " " << i;
        return 0;
      }
      for (int p = 0; p < cnt[t]; p++) {
        int x1 = get(t, p).first;
        int x2 = get(t, p).second;
        if (s[i - 1][j - 1] != s[x1 - 1][x2 - 1]) continue;
        long long tmp = 0;
        if (isValid(i - 1, j)) {
          if (isValid(x1 + 1, x2)) {
            tmp = (tmp + pre[pos[i - 1][j]][pos[x1 + 1][x2]]) % inf;
          }
          if (isValid(x1, x2 + 1)) {
            tmp = (tmp + pre[pos[i - 1][j]][pos[x1][x2 + 1]]) % inf;
          }
        }
        if (isValid(i, j - 1)) {
          if (isValid(x1 + 1, x2)) {
            tmp = (tmp + pre[pos[i][j - 1]][pos[x1 + 1][x2]]) % inf;
          }
          if (isValid(x1, x2 + 1)) {
            tmp = (tmp + pre[pos[i][j - 1]][pos[x1][x2 + 1]]) % inf;
          }
        }
        cur[sl][p] = tmp % inf;
      }
    }
  }
  long long ans = 0;
  if (k % 2 == 1) {
    k = (k + 1) / 2;
    for (int i = 0; i < cnt[k]; i++) {
      ans = (ans + cur[i][i]) % inf;
    }
  } else {
    k = k / 2;
    for (int i = 0; i < cnt[k]; i++) {
      int x1 = get(k, i).first;
      int x2 = get(k, i).second;
      if (isValid(x1 + 1, x2))
        ans = (ans + cur[pos[x1][x2]][pos[x1 + 1][x2]]) % inf;
      if (isValid(x1, x2 + 1))
        ans = (ans + cur[pos[x1][x2]][pos[x1][x2 + 1]]) % inf;
    }
  }
  cout << ans;
}
