#include <bits/stdc++.h>
using namespace std;
int power(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = (res * x) % 1000000007;
    y = y / 2, x = (x * x) % 1000000007;
  }
  return res % 1000000007;
}
char arr[505][505];
int dp[505][251][505];
int n, m;
bool check(int x, int y) {
  if (x > n or y > m or x < 1 or y < 1) return false;
  return true;
}
int func(int a, int b, int c, int d, int step) {
  if (abs(a - c) + abs(b - d) <= 1) return 1;
  if (a > c or b > d) return 0;
  int &ret = dp[a][step][c];
  if (ret != -1) return ret;
  ret = 0;
  if (check(a + 1, b) and check(c - 1, d) and arr[a + 1][b] == arr[c - 1][d])
    ret = (ret + func(a + 1, b, c - 1, d, step + 1)) % 1000000007;
  if (check(a + 1, b) and check(c, d - 1) and arr[a + 1][b] == arr[c][d - 1])
    ret = (ret + func(a + 1, b, c, d - 1, step + 1)) % 1000000007;
  if (check(a, b + 1) and check(c - 1, d) and arr[a][b + 1] == arr[c - 1][d])
    ret = (ret + func(a, b + 1, c - 1, d, step + 1)) % 1000000007;
  if (check(a, b + 1) and check(c, d - 1) and arr[a][b + 1] == arr[c][d - 1])
    ret = (ret + func(a, b + 1, c, d - 1, step + 1)) % 1000000007;
  return ret;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  int i, j, k;
  for (i = 0; i < 505; i++) {
    for (j = 0; j < 251; j++) {
      for (k = 0; k < 505; k++) {
        dp[i][j][k] = -1;
      }
    }
  }
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      cin >> arr[i][j];
    }
  }
  if (arr[1][1] == arr[n][m])
    cout << func(1, 1, n, m, 0);
  else
    cout << 0;
}
