#include <bits/stdc++.h>
using namespace std;
int dp[2][505][505];
char A[505][505];
inline void Add(int &x, int y) {
  x += y;
  if (x >= 1000000007) x -= 1000000007;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = (1), i_ = (n); i <= i_; i++) scanf("%s", A[i] + 1);
  if (A[1][1] != A[n][m]) {
    puts("0");
    return 0;
  }
  dp[0][1][n] = 1;
  int step = (n - 1 + m - 1) / 2, cur = 0;
  for (int i = (1), i_ = (step); i <= i_; i++) {
    cur ^= 1;
    memset(dp[cur], 0, sizeof dp[cur]);
    for (int j = (0), j_ = (min(i, n - 1)); j <= j_; j++) {
      int jj = i - j + 1;
      for (int k = (0), k_ = (min(i, n - 1)); k <= k_; k++) {
        int kk = m - (i - k);
        if (A[j + 1][jj] == A[n - k][kk]) {
          Add(dp[cur][j + 1][n - k], dp[1 - cur][j][n - k]);
          Add(dp[cur][j + 1][n - k], dp[1 - cur][j][n - k + 1]);
          Add(dp[cur][j + 1][n - k], dp[1 - cur][j + 1][n - k]);
          Add(dp[cur][j + 1][n - k], dp[1 - cur][j + 1][n - k + 1]);
        }
      }
    }
  }
  int ans = 0;
  if ((n + m) & 1)
    for (int i = (1), i_ = (n); i <= i_; i++)
      Add(ans, dp[cur][i][i]), Add(ans, dp[cur][i][i + 1]);
  else
    for (int i = (1), i_ = (n); i <= i_; i++) Add(ans, dp[cur][i][i]);
  printf("%d\n", ans);
  return 0;
}
