#include <bits/stdc++.h>
using namespace std;
char second[505][505];
int DP[2][505][505];
inline void add(int &a, int b) {
  a += b;
  if (a >= 1000000007) a -= 1000000007;
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", second[i]);
  if (second[0][0] == second[n - 1][m - 1]) DP[0][0][n - 1] = 1;
  int res = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (i + j + 1 > (n + m) / 2) break;
      for (int ii = 0; ii < n; ii++) {
        int jj = m + n - i - j - ii - 2;
        if (jj >= m || jj < 0) continue;
        if (second[i][j] != second[ii][jj]) continue;
        if (j) {
          add(DP[i % 2][j][ii], DP[i % 2][j - 1][ii]);
          add(DP[i % 2][j][ii], DP[i % 2][j - 1][ii + 1]);
        }
        add(DP[i % 2][j][ii], DP[(i % 2) ^ 1][j][ii]);
        add(DP[i % 2][j][ii], DP[(i % 2) ^ 1][j][ii + 1]);
        if (((i + j + 1) * 2 == n + m - 1 &&
             ((j == jj && i == ii - 1) || (i == i && j == jj - 1))) ||
            (i == ii && j == jj))
          add(res, DP[i % 2][j][ii]);
      }
    }
    for (int j = 0; j < m; j++)
      for (int ii = 0; ii < n; ii++) DP[(i % 2) ^ 1][j][ii] = 0;
  }
  printf("%d", res);
  return 0;
}
