#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const int MOVX[2] = {0, 1};
const int MOVY[2] = {1, 0};
int n, m;
string fore[501];
vector<pair<int, int> > dep[1001];
int pid[501][501];
long long tbl[2][501][501];
inline bool valid(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; }
void bfs() {
  int d[n][m];
  memset(d, -1, sizeof d);
  d[0][0] = 0;
  queue<pair<int, int> > que;
  que.push({0, 0});
  dep[0].push_back({0, 0});
  pid[0][0] = 0;
  while (!que.empty()) {
    pair<int, int> p = que.front();
    que.pop();
    for (int i = 0; i < 2; ++i) {
      int x = p.first + MOVX[i];
      int y = p.second + MOVY[i];
      if (valid(x, y) && d[x][y] == -1) {
        d[x][y] = d[p.first][p.second] + 1;
        pid[x][y] = dep[d[x][y]].size();
        dep[d[x][y]].push_back({x, y});
        que.push({x, y});
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cin >> n >> m;
  for (int i = 0; i < n; ++i) cin >> fore[i];
  bfs();
  int id = 0;
  int len = n + m - 2;
  int h = len >> 1;
  for (int i = 0; i < (int)dep[h].size(); ++i)
    for (int j = 0; j < (int)dep[len - h].size(); ++j)
      tbl[id][i][j] = tbl[!id][i][j] = 0;
  for (const pair<int, int> &p : dep[h]) {
    if (len & 1) {
      for (int i = 0; i < 2; ++i) {
        int x = p.first + MOVX[i];
        int y = p.second + MOVY[i];
        if (valid(x, y) && fore[p.first][p.second] == fore[x][y])
          tbl[id][pid[p.first][p.second]][pid[x][y]] = 1;
      }
    } else {
      tbl[id][pid[p.first][p.second]][pid[p.first][p.second]] = 1;
    }
  }
  while (h > 0) {
    for (const pair<int, int> &p1 : dep[h])
      for (const pair<int, int> &p2 : dep[len - h]) {
        long long &r =
            tbl[id][pid[p1.first][p1.second]][pid[p2.first][p2.second]];
        if (r) {
          for (int i = 0; i < 2; ++i)
            for (int j = 0; j < 2; ++j) {
              int x1 = p1.first - MOVX[i];
              int y1 = p1.second - MOVY[i];
              int x2 = p2.first + MOVX[j];
              int y2 = p2.second + MOVY[j];
              if (valid(x1, y1) && valid(x2, y2) &&
                  fore[x1][y1] == fore[x2][y2]) {
                long long &q = tbl[!id][pid[x1][y1]][pid[x2][y2]];
                q = (q + r) % MOD;
              }
            }
        }
      }
    for (int i = 0; i < (int)dep[h].size(); ++i)
      for (int j = 0; j < (int)dep[len - h - 1].size(); ++j) tbl[id][i][j] = 0;
    id = !id;
    --h;
  }
  cout << tbl[id][0][0] << endl;
  return 0;
}
