#include <bits/stdc++.h>
using namespace std;
int n, m;
const int mod = 1e9 + 7;
char str[550][550];
int dp[2][550][550];
bool check(int x1, int y1, int x2, int y2) {
  if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < m && x2 >= 0 && x2 < n && y2 >= 0 &&
      y2 < m && str[x1][y1] == str[x2][y2])
    return true;
  return false;
}
inline void update(int &a, int b) {
  a += b;
  if (a >= mod) {
    a -= mod;
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", str[i]);
  int now = 0;
  int pre;
  if (str[0][0] == str[n - 1][m - 1])
    dp[now][0][m - 1] = 1;
  else
    dp[now][0][m - 1] = 0;
  for (int k = 1; k <= (n + m - 2) / 2; k++) {
    pre = now;
    now ^= 1;
    memset(dp[now], 0, sizeof(dp[now]));
    for (int i = 0; i < m; i++) {
      for (int j = i; j < m; j++) {
        int x1 = k - i;
        int y1 = i;
        int y2 = j;
        int x2 = n + m - 2 - j - k;
        if (!check(x1, y1, x2, y2)) continue;
        if (check(x1 - 1, y1, x2, y2 + 1))
          update(dp[now][y1][y2], dp[pre][y1][y2 + 1]);
        if (check(x1 - 1, y1, x2 + 1, y2))
          update(dp[now][y1][y2], dp[pre][y1][y2]);
        if (check(x1, y1 - 1, x2, y2 + 1))
          update(dp[now][y1][y2], dp[pre][y1 - 1][y2 + 1]);
        if (check(x1, y1 - 1, x2 + 1, y2))
          update(dp[now][y1][y2], dp[pre][y1 - 1][y2]);
      }
    }
  }
  long long ans = 0;
  for (int i = 0; i < m; i++) ans = (ans + dp[now][i][i]) % mod;
  if ((n + m) % 2 == 1) {
    for (int i = 0; i < m - 1; i++) ans = (ans + dp[now][i][i + 1]) % mod;
  }
  printf("%I64d\n", ans);
  return 0;
}
