#include <bits/stdc++.h>
using namespace std;
void OF() {
  freopen(
      "f"
      ".inp",
      "r", stdin);
  freopen(
      "f"
      ".out",
      "w", stdout);
}
const long long maxn = 5e2 + 7, MOD = 1e9 + 7;
long long n, m, dp[2][maxn][maxn];
char a[maxn][maxn];
bool check(long long x1, long long y1, long long x2, long long y2) {
  if (y1 < 1 || y1 > m || y2 < 1 || y2 > m) return 0;
  if (x1 < 1 || x1 > n || x2 < 1 || x2 > n) return 0;
  return (a[x1][y1] == a[x2][y2]);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (long long i = 1; i <= n; ++i)
    for (long long j = 1; j <= m; ++j) cin >> a[i][j];
  memset(dp, 0, sizeof(dp));
  dp[1][1][n] = (a[1][1] == a[n][m]);
  for (long long i = 1; i <= ((m + n) >> 1) - 1; ++i) {
    for (long long x1 = 1; x1 <= n; ++x1)
      for (long long x2 = n; x2 >= 1; --x2) {
        long long y1 = i + 1 - x1, y2 = m + n - x2 + 1 - i,
                  cur = dp[i & 1][x1][x2];
        if (y1 < 1 || y1 > m || y2 < 1 || y2 > m) continue;
        long long nstat = (i + 1) & 1;
        if (check(x1 + 1, y1, x2 - 1, y2))
          (dp[nstat][x1 + 1][x2 - 1] += cur) %= MOD;
        if (check(x1, y1 + 1, x2 - 1, y2))
          (dp[nstat][x1][x2 - 1] += cur) %= MOD;
        if (check(x1 + 1, y1, x2, y2 - 1))
          (dp[nstat][x1 + 1][x2] += cur) %= MOD;
        if (check(x1, y1 + 1, x2, y2 - 1)) (dp[nstat][x1][x2] += cur) %= MOD;
        dp[i & 1][x1][x2] = 0;
      }
  }
  long long sl = (n + m) / 2, ans = 0;
  if ((n + m) & 1) {
    for (long long i = 1; i <= n; ++i)
      (ans += dp[sl & 1][i][i] + dp[sl & 1][i][i + 1]) %= MOD;
  } else {
    for (long long i = 1; i <= n; ++i) (ans += dp[sl & 1][i][i]) %= MOD;
  }
  cout << ans;
}
