#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
char p[505][505];
long long dp[505][505];
long long t[505][505];
void add(long long &a, long long b) { a = (a + b) % mod; }
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    scanf("%s", p[i]);
  }
  if (p[0][0] != p[n - 1][m - 1]) {
    printf("0\n");
    return 0;
  }
  memset(dp, 0, sizeof(dp));
  memset(t, 0, sizeof(t));
  int all_step = (n + m - 2) / 2;
  dp[0][n - 1] = 1;
  for (int step = 1; step <= all_step; ++step) {
    for (int i = 0; i <= step; ++i) {
      for (int j = n - 1; j >= n - 1 - step; --j) {
        int he = m + n - 2;
        if (i != 0 && p[i - 1][step - i] == p[j][he - step - j + 1])
          add(t[i][j], dp[i - 1][j]);
        if (i != 0 && j != n - 1 &&
            p[i - 1][step - i] == p[j + 1][he - step - j])
          add(t[i][j], dp[i - 1][j + 1]);
        if (p[i][step - i - 1] == p[j][he - step - j + 1])
          add(t[i][j], dp[i][j]);
        if (j != n - 1 && p[i][step - i - 1] == p[j + 1][he - step - j])
          add(t[i][j], dp[i][j + 1]);
      }
    }
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        dp[i][j] = t[i][j];
        t[i][j] = 0;
      }
    }
  }
  long long ans = 0;
  if ((n + m) % 2 == 0) {
    for (int i = 0; i < n; ++i) {
      add(ans, dp[i][i]);
    }
    cout << ans << endl;
  } else {
    for (int i = 0; i < n; ++i) {
      int s = all_step;
      if (all_step - i + 1 < m && p[i][s - i] == p[i][s - i + 1])
        add(ans, dp[i][i]);
      if (i + 1 < n && p[i][s - i] == p[i + 1][s - i]) add(ans, dp[i][i + 1]);
    }
    cout << ans << endl;
  }
}
