#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 501;
char s[N][N];
int n, m;
int dp[2][N][N];
inline void add(int &x, int v) {
  x += v;
  if (x >= mod) x -= mod;
}
inline bool in(int x, int y) { return 0 <= x && x < n && 0 <= y && y < m; }
int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; ++i) {
    scanf("%s", s[i]);
  }
  if (s[0][0] != s[n - 1][m - 1]) {
    puts("0");
    return 0;
  }
  int cur = 0, ans = 0, step = n + m - 2;
  step = (step + 1) / 2 + 1;
  dp[0][0][n - 1] = 1;
  for (int i = 1; i <= step; ++i) {
    cur ^= 1;
    memset(dp[cur], 0, sizeof(dp[cur]));
    for (int y1, x1 = 0; x1 < i; ++x1) {
      for (int y2, x2 = x1; x2 < n; ++x2) {
        y1 = i - 1 - x1;
        y2 = n + m - 1 - i - x2;
        if (y1 > y2) continue;
        if (!in(x1, y1) || !in(x2, y2)) continue;
        if (dp[cur ^ 1][x1][x2] == 0) continue;
        if (abs(x1 - x2) + abs(y1 - y2) <= 1) {
          add(ans, dp[cur ^ 1][x1][x2]);
          continue;
        }
        for (int j = 0; j < 2; ++j) {
          for (int k = 2; k < 4; ++k) {
            int nx1 = x1 + dx[j], ny1 = y1 + dy[j];
            int nx2 = x2 + dx[k], ny2 = y2 + dy[k];
            if (!in(nx1, ny1) || !in(nx2, ny2)) continue;
            if (s[nx1][ny1] != s[nx2][ny2]) continue;
            add(dp[cur][nx1][nx2], dp[cur ^ 1][x1][x2]);
          }
        }
      }
    }
  }
  printf("%d\n", ans);
  return 0;
}
