#include <bits/stdc++.h>
using namespace std;
template <class T>
int getbit(T s, int i) {
  return (s >> i) & 1;
}
template <class T>
T onbit(T s, int i) {
  return s | (T(1) << i);
}
template <class T>
T offbit(T s, int i) {
  return s & (~(T(1) << i));
}
template <class T>
int cntbit(T s) {
  return __builtin_popcount(s);
}
template <class T>
T gcd(T a, T b) {
  T r;
  while (b != 0) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
int f[505][505], g[505][505];
int n, m;
string s[505];
void add(int &x, int y) {
  x += y;
  if (x >= 1000000007) x -= 1000000007;
}
bool inside(int r, int c) { return r >= 1 && r <= n && c >= 1 && c <= m; }
bool can(int r1, int c1, int r2, int c2) {
  return inside(r1, c1) && inside(r2, c2) &&
         s[r1 - 1][c1 - 1] == s[r2 - 1][c2 - 1];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m;
  for (int i = 0; i < (n); ++i) cin >> s[i];
  int d = (n + m) >> 1;
  memset(f, 0, sizeof(f));
  memset(g, 0, sizeof(g));
  if (can(1, 1, n, m)) f[1][n] = 1;
  for (int run = 0; run < (d - 1); ++run) {
    for (int i = 0; i < (505); ++i)
      for (int j = 0; j < (505); ++j) {
        g[i][j] = f[i][j];
        f[i][j] = 0;
      }
    int s1 = run + 3;
    int s2 = (n + m - run - 1);
    for (int i = (1); i <= (n); ++i)
      for (int j = (1); j <= (n); ++j) {
        int ic = s1 - i, jc = s2 - j;
        if (can(i, ic, j, jc)) {
          add(f[i][j], g[i][j]);
          add(f[i][j], g[i - 1][j]);
          add(f[i][j], g[i][j + 1]);
          add(f[i][j], g[i - 1][j + 1]);
        }
      }
  }
  int res = 0;
  for (int i = (1); i <= (n); ++i) {
    add(res, f[i][i]);
    if ((n + m) & 1) {
      add(res, f[i][i + 1]);
    }
  }
  cout << res << endl;
  return 0;
}
