#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
int dp[502][502][2], n, m;
char str[502][502];
int dis;
int check(int x, int y) {
  if (x < 0 or x >= n and y < 0 or y >= m)
    return 0;
  else
    return 1;
}
int call(int x, int y, int a, int idx) {
  int ham = x + y;
  int paisi = n - 1 - a;
  int baki = ham - paisi;
  int b = m - 1 - baki;
  if (check(x, y) == 0 or check(a, b) == 0) return dp[x][y][a & 1] = 0;
  if (str[x][y] != str[a][b]) return dp[x][y][a & 1] = 0;
  if (idx == 0) return dp[x][y][a & 1];
  int dx = ((x - a) < 0 ? -(x - a) : (x - a));
  int dy = ((y - b) < 0 ? -(y - b) : (y - b));
  if (dis % 2 == 0) {
    if (ham + 1 > dis / 2) return dp[x][y][a & 1] = 0;
    if (ham + 1 == dis / 2) return dp[x][y][a & 1] = (dx + dy <= 1);
  } else {
    if (ham > dis / 2) return dp[x][y][a & 1] = 0;
    if (ham == dis / 2) return dp[x][y][a & 1] = (x == a and y == b);
  }
  long long ret = 0;
  ret += call(x + 1, y, a, 1 - idx);
  ret += call(x + 1, y, a - 1, 1 - idx);
  ret += call(x, y + 1, a, 1 - idx);
  ret += call(x, y + 1, a - 1, 1 - idx);
  return dp[x][y][a & 1] = ret % MOD;
}
int main() {
  scanf("%d %d", &n, &m);
  dis = n + m - 1;
  for (int i = 0; i < n; i++) scanf("%s", str[i]);
  for (int a = 0; a < n; a++) {
    for (int y = m - 1; y >= 0; y--) {
      int tempx = n - 1;
      int tempy = y;
      while (tempx >= 0 and tempy < m) {
        call(tempx, tempy, a, 1);
        tempy++;
        tempx--;
      }
    }
    for (int x = n - 2; x >= 0; x--) {
      int tempx = x;
      int tempy = 0;
      while (tempx >= 0 and tempy < m) {
        call(tempx, tempy, a, 1);
        tempy++;
        tempx--;
      }
    }
  }
  printf("%d\n", dp[0][0][(n - 1) & 1]);
}
