#include <bits/stdc++.h>
using namespace std;
char a[500 + 5][500 + 5];
int n, m, s, als, ans, dp[2][500 + 5][500 + 5];
int read() {
  char c;
  int x = 0, f = 1;
  c = getchar();
  while (c > '9' || c < '0') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0', c = getchar();
  }
  return x * f;
}
int Inc(int a, int b) { return (a += b) >= 1000000007 ? a - 1000000007 : a; }
int main() {
  n = read(), m = read(), als = (n + m - 2) / 2;
  for (int i = 1; i <= n; ++i) scanf("%s", a[i] + 1);
  if (a[1][1] != a[n][m]) {
    puts("0");
    return 0;
  }
  dp[0][1][n] = s = 1;
  for (int i = 1; i <= als; ++i) {
    for (int x = 1; x <= n; ++x)
      for (int xx = n; xx >= 1; --xx) {
        int y = 1 + i - (x - 1), yy = m - (i - (n - xx));
        if (a[x][y] != a[xx][yy] || y < 1 || y > m || yy < 1 || yy > m)
          continue;
        if (x > 1) dp[s][x][xx] = Inc(dp[s][x][xx], dp[s ^ 1][x - 1][xx]);
        if (x > 1 && xx < n)
          dp[s][x][xx] = Inc(dp[s][x][xx], dp[s ^ 1][x - 1][xx + 1]);
        dp[s][x][xx] = Inc(dp[s][x][xx], dp[s ^ 1][x][xx]);
        if (xx < n) dp[s][x][xx] = Inc(dp[s][x][xx], dp[s ^ 1][x][xx + 1]);
      }
    s ^= 1;
    for (int x = 1; x <= n; ++x)
      for (int xx = n; xx >= 1; --xx) dp[s][x][xx] = 0;
  }
  s ^= 1;
  for (int x = 1; x <= n; ++x) {
    int y = 1 + als - (x - 1);
    if (y < 1 || y > m) continue;
    if ((n + m) % 2)
      ans = Inc(ans, Inc(dp[s][x][x], dp[s][x][n - (als - (m - y))]));
    else
      ans = Inc(ans, dp[s][x][x]);
  }
  printf("%d", ans);
  return 0;
}
