#include <bits/stdc++.h>
using namespace std;
int f[3][501][501];
string str[501];
char s[501][501];
int m, n;
const int mod = 1e9 + 7;
int main() {
  scanf("%d%d", &m, &n);
  for (int i = 1; i <= m; ++i) {
    cin >> str[i];
    for (int j = 0; j < n; ++j) s[i][j + 1] = str[i][j];
  }
  if (s[1][1] != s[m][n]) {
    printf("0\n");
    return 0;
  } else
    f[2][1][m] = 1;
  int maxstep = (m + n - 3) / 2;
  int now = 2;
  for (int step = 1; step <= maxstep; ++step) {
    now = 3 - now;
    int i, j, p, q;
    for (int i = 1; i <= m; i++)
      for (int j = 1; j <= m; j++) f[now][i][j] = 0;
    for (i = 1; i <= m; i++) {
      j = step + 2 - i;
      if (j >= 1 && j <= n) {
        for (p = m; p >= 1; p--) {
          q = m + n - step - p;
          if (q >= 1 && q <= n) {
            if (p >= i && q >= j && s[i][j] == s[p][q]) {
              f[now][i][p] = 0;
              if (i >= 2 && p <= m - 1 && s[i - 1][j] == s[p + 1][q])
                f[now][i][p] = (f[now][i][p] + f[3 - now][i - 1][p + 1]) % mod;
              if (i >= 2 && q <= n - 1 && s[i - 1][j] == s[p][q + 1])
                f[now][i][p] = (f[now][i][p] + f[3 - now][i - 1][p]) % mod;
              if (j >= 2 && p <= m - 1 && s[i][j - 1] == s[p + 1][q])
                f[now][i][p] = (f[now][i][p] + f[3 - now][i][p + 1]) % mod;
              if (j >= 2 && q <= n - 1 && s[i][j - 1] == s[p][q + 1])
                f[now][i][p] = (f[now][i][p] + f[3 - now][i][p]) % mod;
            }
          }
        }
      }
    }
  }
  int ans = 0;
  if ((m + n - 3) % 2 == 0) {
    for (int i = 1; i <= m; i++)
      for (int j = 1; j <= m; j++)
        if (i == j || i == j - 1) {
          ans = (ans + f[now][i][j]) % mod;
        }
  } else {
    for (int i = 1; i <= m; i++)
      for (int j = 1; j <= m; j++)
        if (i == j || i == j - 1 || i == j - 2) {
          ans = (ans + f[now][i][j]) % mod;
          if (i == j - 1) ans = (ans + f[now][i][j]) % mod;
        }
  }
  cout << ans << endl;
  return 0;
}
