#include <bits/stdc++.h>
using namespace std;
const int MAXN = 505;
const int MOD = 1000 * 1000 * 1000 + 7;
char in[MAXN][MAXN];
int n, m, t[2][MAXN][MAXN];
bool czyIstnieje(int x, int y) {
  return (1 <= x && x <= n && 1 <= y && y <= m);
}
bool czyPrzejscie(int x1, int y1, int x2, int y2) {
  if (!czyIstnieje(x1, y1) || !czyIstnieje(x2, y2)) return false;
  return (x1 <= x2 && y1 <= y2 && in[x1][y1] == in[x2][y2]);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%s", in[i] + 1);
  for (int warstwa = (n + m - 1) / 2; warstwa >= 1; warstwa--) {
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) {
        int x = warstwa - i + 1;
        int y = n + m - warstwa - j + 1;
        if (!czyPrzejscie(i, x, j, y)) {
          t[1][i][j] = 0;
          continue;
        }
        if (warstwa == (n + m - 1) / 2) {
          int parzystosc = (n + m - 1) % 2 == 0 ? 1 : 2;
          if (i <= j && (abs(i - j) + abs(x - y) == parzystosc))
            t[1][i][j] = (i != j && x != y && parzystosc == 2) ? 2 : 1;
          else
            t[1][i][j] = 0;
          continue;
        }
        if (czyPrzejscie(i, x + 1, j - 1, y))
          t[1][i][j] = (t[1][i][j] + t[0][i][j - 1]) % MOD;
        if (czyPrzejscie(i, x + 1, j, y - 1))
          t[1][i][j] = (t[1][i][j] + t[0][i][j]) % MOD;
        if (czyPrzejscie(i + 1, x, j - 1, y))
          t[1][i][j] = (t[1][i][j] + t[0][i + 1][j - 1]) % MOD;
        if (czyPrzejscie(i + 1, x, j, y - 1))
          t[1][i][j] = (t[1][i][j] + t[0][i + 1][j]) % MOD;
      }
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) t[0][i][j] = t[1][i][j], t[1][i][j] = 0;
  }
  printf("%d", t[0][1][n]);
  return 0;
}
