#include <bits/stdc++.h>
using namespace std;
int OK = 1;
bool debug = true;
const int INF = 0x3f3f3f3f;
const int maxn = 510;
const int mod = 1e9 + 7;
int n, m;
char s[maxn][maxn];
int dp[2][maxn][maxn];
void add(int &a, int b) {
  a += b;
  if (a >= mod) a -= mod;
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) scanf("%s", s[i] + 1);
  int cur = 0;
  dp[0][1][n] = (s[1][1] == s[n][m]);
  for (int sp = 1; sp <= (n + m - 2) >> 1; ++sp) {
    cur ^= 1;
    memset((dp[cur]), 0, sizeof(dp[cur]));
    for (int x1 = 1; x1 <= n && sp >= x1 - 1; ++x1) {
      for (int x2 = n; x2 >= x1 && n - x2 <= sp; --x2) {
        int y1 = 1 + sp - (x1 - 1);
        int y2 = m - (sp - (n - x2));
        if (y1 > y2) continue;
        if (s[x1][y1] != s[x2][y2]) continue;
        add(dp[cur][x1][x2], dp[cur ^ 1][x1][x2]);
        add(dp[cur][x1][x2], dp[cur ^ 1][x1 - 1][x2 + 1]);
        add(dp[cur][x1][x2], dp[cur ^ 1][x1 - 1][x2]);
        add(dp[cur][x1][x2], dp[cur ^ 1][x1][x2 + 1]);
      }
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    add(ans, dp[cur][i][i]);
  }
  if ((n + m) % 2) {
    for (int i = 1; i <= n; i++) {
      add(ans, dp[cur][i][i + 1]);
    }
  }
  printf("%d\n", ans);
  return 0;
}
