#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const long long int INFF = 1e17;
const double EPS = 1e-9;
const long long int MOD = 1e9 + 7;
const int MAXN = 510;
int n, m, dp[2][MAXN][MAXN], x_n, y_n, currX, currY;
string a[MAXN];
int access(int x1, int y1, int x2, int y2) {
  if (x1 >= n || x2 >= n || y1 >= m || y2 >= m || x1 < 0 || y1 < 0 || x2 < 0 ||
      y2 < 0)
    return 0;
  if ((x1 + 1) == currX || (x1 == currX && y1 <= currY))
    return dp[x1 % 2][y1][x2];
  return -1;
}
int f(int x1, int y1, int x2) {
  int y2 = x_n - x2 - x1 - y1 + y_n;
  if (x1 >= n || x2 >= n || y1 >= m || y2 >= m || x1 < 0 || y1 < 0 || x2 < 0 ||
      y2 < 0)
    return 0;
  if (x1 > x2 || y1 > y2) return 0;
  if (a[x1][y1] != a[x2][y2]) return 0;
  if (x1 == x2 && y1 == y2) return 1;
  if ((x1 + 1 == x2 && y1 == y2) || (x1 == x2 && y1 + 1 == y2)) return 1;
  long long int ans = 0;
  ans =
      ((long long int)ans + ((long long int)access(x1 + 1, y1, x2 - 1, y2) == -1
                                 ? f(x1 + 1, y1, x2 - 1)
                                 : access(x1 + 1, y1, x2 - 1, y2))) %
      MOD;
  ans =
      ((long long int)ans + ((long long int)access(x1 + 1, y1, x2, y2 - 1) == -1
                                 ? f(x1 + 1, y1, x2)
                                 : access(x1 + 1, y1, x2, y2 - 1))) %
      MOD;
  ans =
      ((long long int)ans + ((long long int)access(x1, y1 + 1, x2 - 1, y2) == -1
                                 ? f(x1, y1 + 1, x2 - 1)
                                 : access(x1, y1 + 1, x2 - 1, y2))) %
      MOD;
  ans =
      ((long long int)ans + ((long long int)access(x1, y1 + 1, x2, y2 - 1) == -1
                                 ? f(x1, y1 + 1, x2)
                                 : access(x1, y1 + 1, x2, y2 - 1))) %
      MOD;
  return (int)ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  x_n = n - 1, y_n = m - 1, currX = n - 1, currY = m - 1;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 1; i >= 0; i--)
    for (int j = m - 1; j >= 0; j--)
      for (int k = n - 1; k >= 0; k--) dp[i][j][k] = 0;
  for (int i = n - 1; i >= 0; i--) {
    for (int j = m - 1; j >= 0; j--) {
      for (int k = n - 1; k >= 0; k--) {
        dp[i % 2][j][k] = f(i, j, k);
      }
      currY = j;
    }
    currX = i;
  }
  printf("%d\n", dp[0][0][n - 1]);
  ;
  return 0;
}
