#include <bits/stdc++.h>
using namespace std;
char s[510][510];
const int mod = 1000000007;
int dp[2][510][510];
inline void upd(int &x, int t) {
  x += t;
  if (x >= mod) x -= mod;
}
vector<int> vy[510], vx[510], wy[510], wx[510];
int p[510][510];
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%s", s[i]);
  }
  if (n == 1 && m == 1) {
    printf("1\n");
    return 0;
  }
  dp[0][0][0] = s[0][0] == s[n - 1][m - 1];
  for (int i = 0; i < (n + m + 1) / 2; i++) {
    int py = 0, px = i, k = 0;
    for (int j = 0; j <= i; j++) {
      if (py >= 0 && py < n && px >= 0 && px < m) {
        p[py][px] = k++;
        vy[i].push_back(py);
        vx[i].push_back(px);
      }
      py++;
      px--;
    }
    py = n - 1 - i, px = m - 1, k = 0;
    for (int j = 0; j <= i; j++) {
      if (py >= 0 && py < n && px >= 0 && px < m) {
        p[py][px] = k++;
        wy[i].push_back(py);
        wx[i].push_back(px);
      }
      py++;
      px--;
    }
  }
  int y, z, t = (n + m) / 2 - 1;
  for (int i = 0; i < t; i++) {
    y = i & 1, z = y ^ 1;
    for (int j = 0; j < 510; j++) {
      for (int k = 0; k < 510; k++) {
        dp[z][j][k] = 0;
      }
    }
    for (int j = 0; j < vy[i].size(); j++) {
      int py = vy[i][j], px = vx[i][j];
      for (int k = 0; k < wy[i].size(); k++) {
        if (dp[y][j][k]) {
          int qy = wy[i][k], qx = wx[i][k];
          int npy, npx, nqy, nqx, c = dp[y][j][k];
          if (py < n - 1) {
            npy = py + 1;
            npx = px;
            if (qy > 0) {
              nqy = qy - 1;
              nqx = qx;
              if (s[npy][npx] == s[nqy][nqx]) {
                upd(dp[z][p[npy][npx]][p[nqy][nqx]], c);
              }
            }
            if (qx > 0) {
              nqy = qy;
              nqx = qx - 1;
              if (s[npy][npx] == s[nqy][nqx]) {
                upd(dp[z][p[npy][npx]][p[nqy][nqx]], c);
              }
            }
          }
          if (px < m - 1) {
            npy = py;
            npx = px + 1;
            if (qy > 0) {
              nqy = qy - 1;
              nqx = qx;
              if (s[npy][npx] == s[nqy][nqx]) {
                upd(dp[z][p[npy][npx]][p[nqy][nqx]], c);
              }
            }
            if (qx > 0) {
              nqy = qy;
              nqx = qx - 1;
              if (s[npy][npx] == s[nqy][nqx]) {
                upd(dp[z][p[npy][npx]][p[nqy][nqx]], c);
              }
            }
          }
        }
      }
    }
  }
  int ans = 0;
  if ((n + m) & 1) {
    for (int i = 0; i < vy[t].size(); i++) {
      int py = vy[t][i], px = vx[t][i];
      if (py < n - 1) {
        upd(ans, dp[z][i][p[py + 1][px]]);
      }
      if (px < m - 1) {
        upd(ans, dp[z][i][p[py][px + 1]]);
      }
    }
  } else {
    for (int i = 0; i < vy[t].size(); i++) {
      upd(ans, dp[z][i][i]);
    }
  }
  printf("%d\n", ans);
  return 0;
}
