#include <bits/stdc++.h>
using namespace std;
const long double pi = 3.14159265359;
template <typename T>
T abs(T x) {
  return x > 0 ? x : -x;
}
template <typename T>
T sqr(T x) {
  return x * x;
}
const int maxn = 505;
const long long mod = 1000000007;
char f[maxn][maxn];
int* dp[maxn * 3];
int n, m;
long long rec(int a, int b, int c, int d) {
  if (a == n || b == m || c < 0 || d < 0 || f[a][b] != f[c][d] || a > c ||
      b > d) {
    return 0;
  }
  int len = a + b + 1;
  int& res = dp[len][a * len + m - 1 - d];
  if (res != -1) {
    return res;
  }
  res = 0;
  int e = abs(a - c) + abs(b - d);
  if (e == 0) {
    res = 1;
  } else if (e == 1) {
    res = (f[a][b] == f[c][d]);
  } else {
    for (auto d1 : {make_pair(1, 0), make_pair(0, 1)}) {
      for (auto d2 : {make_pair(-1, 0), make_pair(0, -1)}) {
        if (!(a + d1.first >= n || b + d1.second >= m || c + d2.first < 0 ||
              d + d2.second < 0)) {
          res += rec(a + d1.first, b + d1.second, c + d2.first, d + d2.second);
          if (res >= mod) {
            res -= mod;
          }
        }
      }
    }
  }
  return res;
}
int main() {
  srand(time(NULL));
  scanf("%d %d\n", &n, &m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      scanf("%c", &f[i][j]);
    }
    scanf("\n");
  }
  for (int i = 1; i < maxn; i++) {
    dp[i] = new int[i * i + 5];
    fill(dp[i], dp[i] + i * i + 5, -1);
  }
  cout << rec(0, 0, n - 1, m - 1) << endl;
  return 0;
}
