#include <bits/stdc++.h>
#pragma warning(disable : 4996)
int n, m, cnt;
char mp[502][502];
int mem[41917000];
bool chk[41917000];
int dist(int x1, int y1, int x2, int y2) {
  return ((x1 - x2) < 0 ? -(x1 - x2) : (x1 - x2)) +
         ((y1 - y2) < 0 ? -(y1 - y2) : (y1 - y2));
}
void add(int &p, int q) {
  p += q;
  if (p >= 1000000007) p -= 1000000007;
}
int getinx(int x, int y, int rx) {
  int hp = x + y;
  return hp * (hp + 1) * (2 * hp + 1) / 6 + y * (hp + 1) + rx;
}
int dy(int x, int y, int rx) {
  int ry = x + y - rx;
  if (x + rx >= n) return 0;
  if (y + ry >= m) return 0;
  if (mp[x][y] != mp[n - 1 - rx][m - 1 - ry]) return 0;
  if (x + y + rx + ry == n + m - 2) {
    if (dist(x, y, n - 1 - rx, m - 1 - ry) == 0) return 1;
    return 0;
  }
  if (x + y + rx + ry == n + m - 3) {
    if (dist(x, y, n - 1 - rx, m - 1 - ry) == 1) return 1;
    return 0;
  }
  int tp = getinx(x, y, rx);
  if (chk[tp]) return mem[tp];
  int sum = 0;
  add(sum, dy(x + 1, y, rx + 1));
  add(sum, dy(x + 1, y, rx));
  add(sum, dy(x, y + 1, rx + 1));
  add(sum, dy(x, y + 1, rx));
  mem[tp] = sum, chk[tp] = 1, cnt++;
  return sum;
}
int main() {
  int i;
  scanf("%d%d\n", &n, &m);
  for (i = 0; i < n; i++) gets(mp[i]);
  printf("%d", dy(0, 0, 0));
  return 0;
}
