#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 510;
char a[N][N], b[N][N];
int f[2][N][N];
int n, m;
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%s", a[i] + 1);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      b[n + 1 - i][m + 1 - j] = a[i][j];
    }
  }
  f[1][0][0] = 1;
  for (int i = 2; i <= (n + m) / 2 + 1; i++) {
    int cur = i & 1;
    memset(f[cur], 0, sizeof(f[cur]));
    for (int x1 = 1; x1 <= min(i - 1, n); x1++) {
      int y1 = i - x1;
      for (int x2 = 1; x2 <= min(i - 1, n); x2++) {
        int y2 = i - x2;
        if (a[x1][y1] == b[x2][y2]) {
          f[cur][x1][x2] += f[1 - cur][x1][x2] + f[1 - cur][x1 - 1][x2];
          if (f[cur][x1][x2] >= MOD) f[cur][x1][x2] -= MOD;
          f[cur][x1][x2] +=
              (f[1 - cur][x1][x2 - 1] + f[1 - cur][x1 - 1][x2 - 1]) % MOD;
          if (f[cur][x1][x2] >= MOD) f[cur][x1][x2] -= MOD;
        }
      }
    }
  }
  int ans = 0;
  int len = min(n, (n + m) / 2);
  int cur = 1 - (((n + m) / 2) & 1);
  for (int i = 1; i <= len; i++) {
    if ((n + m) & 1) {
      int j = n + 1 - i;
      ans += f[cur][i][j];
      if (ans >= MOD) ans -= MOD;
      j = n - i;
      ans += f[cur][i][j];
      if (ans >= MOD) ans -= MOD;
    } else {
      int j = n + 1 - i;
      ans += f[cur][i][j];
      if (ans >= MOD) ans -= MOD;
    }
  }
  printf("%d", ans);
}
