#include <bits/stdc++.h>
using namespace std;
int n, m;
int poss(int r1, int c1, int r2, int c2) {
  if (!(r1 >= 0 && r1 < n && r2 >= 0 && r2 < n && c1 >= 0 && c1 < m &&
        c2 >= 0 && c2 < m))
    return 0;
  int dx = r2 - r1;
  int dy = c2 - c1;
  if (dx < 0 || dy < 0) return 0;
  return 1;
}
int dp[2][510][510];
int main() {
  ios_base::sync_with_stdio(false);
  for (int i = (int)(0); i < (int)(2); i++)
    for (int j = (int)(0); j < (int)(510); j++)
      for (int k = (int)(0); k < (int)(510); k++) dp[i][j][k] = 0;
  cin >> n >> m;
  vector<string> arr(n);
  for (int i = (int)(0); i < (int)(n); i++) cin >> arr[i];
  if (arr[0][0] == arr[n - 1][m - 1]) dp[0][0][n - 1] = 1;
  for (int moves = 1; 2 * moves <= (n + m - 2); moves++) {
    for (int i = (int)(0); i < (int)(n); i++)
      for (int j = (int)(0); j < (int)(n); j++) dp[1][i][j] = 0;
    for (int r1 = 0; r1 < n; r1++) {
      for (int r2 = 0; r2 < n; r2++) {
        int c1 = moves - 1 - r1;
        int c2 = (n + m - 2) - moves - r2 + 1;
        if (!poss(r1, c1, r2, c2)) continue;
        int ways = dp[0][r1][r2];
        if (poss(r1 + 1, c1, r2 - 1, c2) && arr[r1 + 1][c1] == arr[r2 - 1][c2])
          dp[1][r1 + 1][r2 - 1] = (dp[1][r1 + 1][r2 - 1] + ways) % 1000000007;
        if (poss(r1, c1 + 1, r2 - 1, c2) && arr[r1][c1 + 1] == arr[r2 - 1][c2])
          dp[1][r1][r2 - 1] = (dp[1][r1][r2 - 1] + ways) % 1000000007;
        if (poss(r1 + 1, c1, r2, c2 - 1) && arr[r1 + 1][c1] == arr[r2][c2 - 1])
          dp[1][r1 + 1][r2] = (dp[1][r1 + 1][r2] + ways) % 1000000007;
        if (poss(r1, c1 + 1, r2, c2 - 1) && arr[r1][c1 + 1] == arr[r2][c2 - 1])
          dp[1][r1][r2] = (dp[1][r1][r2] + ways) % 1000000007;
      }
    }
    for (int i = (int)(0); i < (int)(n); i++)
      for (int j = (int)(0); j < (int)(n); j++) dp[0][i][j] = dp[1][i][j];
  }
  int ans = 0;
  for (int i = (int)(0); i < (int)(n); i++)
    for (int j = (int)(0); j < (int)(n); j++)
      ans = (ans + dp[0][i][j]) % 1000000007;
  cout << ans << endl;
  return 0;
}
