#include <bits/stdc++.h>
using namespace std;
char s[502][502];
long long dp[2][502][502];
int cal(int i, int j, int k, int l) { return abs(i - k) + abs(j - l); }
long long solve(int n, int m) {
  long long ret = (s[0][0] == s[n - 1][m - 1]);
  dp[0][0][n - 1] = ret;
  for (int i = 1; i < (n + m) / 2; i++) {
    ret = 0;
    for (int I1 = 0; I1 < n; I1++) {
      int I = I1, J = i - I1;
      if (J < 0 || J >= m) continue;
      for (int I2 = 0; I2 < n; I2++) {
        int II = I2, JJ = (n - 1 - I2) + (m - 1 - i);
        if (JJ < 0 || JJ >= m) continue;
        if (s[I][J] != s[II][JJ]) continue;
        if (2 * (i + 1) + cal(I, J, II, JJ) != n + m) continue;
        if (I - 1 >= 0)
          dp[(i & 1)][I][I2] +=
              dp[!(i & 1)][I - 1][I2 + 1] + dp[!(i & 1)][I - 1][I2];
        dp[(i & 1)][I][I2] += dp[!(i & 1)][I][I2 + 1] + dp[!(i & 1)][I][I2];
        dp[(i & 1)][I][I2] %= 1000000007;
        ret += dp[i & 1][I][I2];
        ret %= 1000000007;
      }
    }
    memset(dp[!(i & 1)], 0, sizeof dp[!(i & 1)]);
  }
  return ret;
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", s[i]);
  }
  cout << solve(n, m) << "\n";
  return 0;
}
