#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxx = 502;
char a[maxx][maxx];
int dp[2][maxx][maxx];
void add(int &x, int &y) {
  x += y;
  if (x >= mod) x -= mod;
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    string str;
    cin >> str;
    for (int j = 0; j < m; j++) {
      a[i][j + 1] = str[j];
    }
  }
  dp[0][1][n] = (a[1][1] == a[n][m]);
  int t;
  for (int l = 1; l <= (n + m - 2) / 2; l++) {
    t = l & 1;
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= n; j++) dp[t][i][j] = 0;
    for (int x = 1; x <= min(n, l + 1); x++) {
      for (int i = n; i >= max(1, n - l); i--) {
        int y = l - x + 2, j = m - (l - (n - i));
        if (a[x][y] != a[i][j]) continue;
        add(dp[t][x][i], dp[t ^ 1][x][i]);
        add(dp[t][x][i], dp[t ^ 1][x - 1][i]);
        add(dp[t][x][i], dp[t ^ 1][x][i + 1]);
        add(dp[t][x][i], dp[t ^ 1][x - 1][i + 1]);
      }
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) add(ans, dp[t][i][i]);
  if ((n + m) & 1) {
    for (int i = 1; i <= n; i++) {
      add(ans, dp[t][i][i + 1]);
    }
  }
  cout << ans << endl;
}
