#include <bits/stdc++.h>
using namespace std;
int N, M, grid[501 + 1][501 + 1];
int memo[501 + 1][501 + 1][260];
int dp(int i1, int i2, int m) {
  int& ret = memo[i1][i2][m];
  if (ret != -1) return ret;
  int j1 = m - i1 + 2;
  int j2 = M + N - i2 - m;
  if (grid[i1][j1] != grid[i2][j2]) return ret = 0;
  if (i1 == i2 && j1 == j2)
    return ret = 1;
  else if (abs(i1 - i2) == 0 && abs(j1 - j2) == 1)
    return ret = 1;
  else if (abs(j1 - j2) == 0 && abs(i1 - i2) == 1)
    return ret = 1;
  else if (i1 > i2 || j1 > j2)
    return ret = 0;
  ret = 0;
  if (grid[i1 + 1][j1] == grid[i2 - 1][j2])
    ret = (ret + dp(i1 + 1, i2 - 1, m + 1)) % 1000000007;
  if (grid[i1][j1 + 1] == grid[i2 - 1][j2])
    ret = (ret + dp(i1, i2 - 1, m + 1)) % 1000000007;
  if (grid[i1 + 1][j1] == grid[i2][j2 - 1])
    ret = (ret + dp(i1 + 1, i2, m + 1)) % 1000000007;
  if (grid[i1][j1 + 1] == grid[i2][j2 - 1])
    ret = (ret + dp(i1, i2, m + 1)) % 1000000007;
  return ret;
}
int main(void) {
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= N; i++) {
    scanf("\n");
    for (int j = 1; j <= M; j++) {
      char c;
      scanf("%c", &c);
      grid[i][j] = c;
    }
  }
  memset(memo, -1, sizeof(memo));
  printf("%d\n", dp(1, N, 0));
  return 0;
}
