#include <bits/stdc++.h>
using namespace std;
const int INF = std::numeric_limits<int>::max() / 3;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }
long long dp[2][510][510];
int vis[510][510];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n, m;
  cin >> n >> m;
  vector<string> A(n, string());
  for (int i = 0; i < n; ++i) cin >> A[i];
  memset((dp), (0), sizeof(dp));
  dp[0][0][n - 1] = A[0][0] == A[n - 1][m - 1];
  int half = (m + n - 2) / 2;
  long long ans = 0;
  for (int l = 1; l <= half; ++l) {
    int curr = l & 1;
    for (int Y1 = 0; Y1 < n; ++Y1)
      for (int Y2 = 0; Y2 < n; ++Y2) {
        dp[curr][Y1][Y2] = 0;
        int X1 = l - Y1;
        int X2 = -(l - (n - Y2 - 1) - (m - 1));
        if (X1 < 0 || X1 >= m || X2 < 0 || X2 >= m) continue;
        if (X2 < X1 || Y2 < Y1) continue;
        if (A[Y1][X1] != A[Y2][X2]) {
          continue;
        }
        long long r1 = Y1 ? dp[curr ^ 1][Y1 - 1][Y2] : 0;
        long long r2 = Y1 && Y2 < n - 1 ? dp[curr ^ 1][Y1 - 1][Y2 + 1] : 0;
        long long r3 = dp[curr ^ 1][Y1][Y2];
        long long r4 = Y2 < n - 1 ? dp[curr ^ 1][Y1][Y2 + 1] : 0;
        dp[curr][Y1][Y2] =
            (((r1 + r2) % (1000000000 + 7)) + ((r3 + r4) % (1000000000 + 7))) %
            (1000000000 + 7);
      }
  }
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      ans = (ans + dp[half & 1][i][j]) % (1000000000 + 7);
    }
  }
  cout << ans << endl;
  return 0;
}
