#include <bits/stdc++.h>
using namespace std;
const int maxn = 510, mod = 1e9 + 7;
int N, M, dn[2][maxn][maxn];
char ar[maxn][maxn];
bool cnt(int a, int b) { return (a >= 1 && a <= N && b >= 1 && b <= M); }
void yaz(int a) {
  for (int i = 1; i <= N; i++, puts(""))
    for (int j = 1; j <= N; j++) printf("%d ", dn[a][i][j]);
}
int main() {
  cin >> N >> M;
  for (int i = 1; i <= N; i++)
    for (int j = 1; j <= M; j++) scanf(" %c", &ar[i][j]);
  int a = (N + M) / 2, b = a, cur = a & 1;
  if ((N + M) & 1) {
    b++;
    for (int i = 1; i <= N; i++) {
      int j = a - i + 1;
      if (!cnt(i, j)) continue;
      if (j != M && ar[i][j] == ar[i][j + 1]) dn[cur][i][i] = 1;
      if (i != N && ar[i][j] == ar[i + 1][j]) dn[cur][i][i + 1] = 1;
    }
  } else {
    for (int i = 1; i <= N; i++) {
      if (!cnt(i, a - i + 1)) continue;
      dn[cur][i][i] = 1;
    }
  }
  while (a > 1) {
    a--, b++;
    cur = !cur;
    for (int i = 1; i <= N; i++)
      for (int j = 1; j <= N; j++) {
        if (!cnt(i, a - i + 1) || !cnt(j, b - j + 1) ||
            ar[i][a - i + 1] != ar[j][b - j + 1]) {
          dn[cur][i][j] = 0;
          continue;
        }
        dn[cur][i][j] = ((dn[!cur][i][j] + dn[!cur][i + 1][j]) % mod +
                         (dn[!cur][i][j - 1] + dn[!cur][i + 1][j - 1]) % mod) %
                        mod;
      }
  }
  cout << dn[1][1][N] << '\n';
  return 0;
}
