#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast,unroll-loops")
const long long int MAXN = 5e2 + 20, md = 1e9 + 7, inf = 5e18;
long long int n, m;
long long int dp[MAXN][MAXN], pd[MAXN][MAXN];
char s[MAXN][MAXN];
pair<long long int, long long int> find_pos(long long int h, long long int k) {
  long long int i, j;
  i = min(n - 1, h);
  j = max(0ll, h - n + 1);
  i -= k;
  j += k;
  if (i < 0 || j >= m) return {-1, -1};
  return {i, j};
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  if (n > m) {
    for (int j = 0; j < n; j++) {
      for (int i = 0; i < m; i++) {
        cin >> s[i][j];
      }
    }
    swap(n, m);
  } else {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        cin >> s[i][j];
      }
    }
  }
  memset(dp, 0, sizeof(dp));
  memset(pd, 0, sizeof(pd));
  long long int q = (n + m) / 2;
  if ((n + m) % 2 == 0) {
    long long int lm = min(n, m);
    for (int i = 0; i < lm; i++) {
      pd[i][i] = 1;
    }
  } else {
    long long int ml = min(n, m);
    for (int i = 0; i < ml; i++) {
      pair<long long int, long long int> p = find_pos(q - 1, i),
                                         o = find_pos(q, i),
                                         h = find_pos(q, i - 1);
      if (p.first == -1) break;
      if (o.first != -1) {
        pd[i][i] = (s[p.first][p.second] == s[o.first][o.second]);
      }
      if (h.first != -1) {
        pd[i][i - 1] = (s[p.first][p.second] == s[h.first][h.second]);
      }
    }
  }
  long long int lm = (n + m + 1) / 2, w = q - 2, v = q + (n + m) % 2;
  for (int k = 1 + (n + m) % 2; k < lm; k++, w--, v++) {
    long long int ml = min(n, m);
    for (int i = 0; i < ml; i++) {
      pair<long long int, long long int> h = find_pos(w, i);
      if (h.first == -1) break;
      for (int j = 0; j < ml; j++) {
        pair<long long int, long long int> o = find_pos(v, j);
        if (o.first == -1) {
          break;
        }
        if (s[h.first][h.second] != s[o.first][o.second]) {
          continue;
        }
        long long int r = pd[i][j] + pd[i][j + 1];
        if (w >= n - 1) {
          if (i > 0) {
            r += pd[i - 1][j] + pd[i - 1][j + 1];
          }
        } else {
          r += pd[i + 1][j] + pd[i + 1][j + 1];
        }
        dp[i][j] = r % md;
      }
    }
    memcpy(pd, dp, sizeof(dp));
    memset(dp, 0, sizeof(dp));
  }
  cout << pd[0][0] << '\n';
  return 0;
}
