#include <bits/stdc++.h>
using namespace std;
const int mod = (int)1e9 + 7;
const int N = 511;
void add(int &x, const int &y) {
  x += y;
  if (x >= mod) x -= mod;
}
int n, m, dp[2][N][N];
char s[N][N];
vector<int> f[N * 2];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
bool inside(int x, int y) {
  return (1 <= x) && (x <= n) && (1 <= y) && (y <= m);
}
void solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) cin >> s[i][j];
  }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) f[i + j].push_back(i);
  }
  int _start = (n + m) / 2 + 1;
  int prev = 0, cur = 1, total = n + m + 2;
  for (int i = 0; i < (int)f[_start].size(); ++i) {
    int x = f[_start][i];
    int y = _start - x;
    if ((n + m - 1) % 2 == 1)
      dp[prev][x][x] = 1;
    else {
      if (inside(x, y + 1) && s[x][y + 1] == s[x][y]) dp[prev][x][x] = 1;
      if (inside(x + 1, y) && s[x + 1][y] == s[x][y]) dp[prev][x][x + 1] = 1;
    }
  }
  for (int sum = _start; sum > 2; --sum) {
    for (int x = 1; x <= n; ++x)
      for (int u = 1; u <= n; ++u) dp[cur][x][u] = 0;
    for (int i = 0; i < (int)f[sum].size(); ++i) {
      int x = f[sum][i];
      int y = sum - x;
      for (int j = 0; j < (int)f[total - sum].size(); ++j) {
        int u = f[total - sum][j];
        int v = total - sum - u;
        if (dp[prev][x][u] == 0) continue;
        for (int c1 = 0; c1 <= 1; ++c1) {
          for (int c2 = 2; c2 <= 3; ++c2) {
            int _x = x + dx[c1], _y = y + dy[c1];
            if (!inside(_x, _y)) continue;
            int _u = u + dx[c2], _v = v + dy[c2];
            if (!inside(_u, _v)) continue;
            if (s[_x][_y] == s[_u][_v]) add(dp[cur][_x][_u], dp[prev][x][u]);
          }
        }
      }
    }
    cur ^= 1, prev ^= 1;
  }
  cout << dp[prev][1][n];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve();
  return 0;
}
