#include <bits/stdc++.h>
using namespace std;
int f[555][555], g[555][555];
char s[555][555];
int n, m, k;
int mod = 1e9 + 7;
int cal(int x) { return ((x >= 0) ? (x) : (-x)); }
int dx1[] = {0, 1};
int dy1[] = {1, 0};
int dx2[] = {-1, 0};
int dy2[] = {0, -1};
bool can_go(int x1, int y1, int x2, int y2) {
  return ((cal(x2 - x1) + cal(y2 - y1) == 1) && x1 <= x2 && y1 <= y2);
}
bool inside(int x, int y) { return (x >= 1 && x <= n && y >= 1 && y <= m); }
void init() {
  if ((m + n - 1) % 2 == 1)
    for (int i = 1; i <= n; i++) f[i][i] = 1;
  else {
    for (int x1 = 1; x1 <= n; x1++)
      for (int x2 = 1; x2 <= n; x2++) {
        int y1 = k - x1 + 1;
        int y2 = m - (k - (n - x2)) + 1;
        if (inside(x1, y1) && inside(x2, y2) && can_go(x1, y1, x2, y2))
          f[x1][x2] = 1;
      }
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%s", &s[i]);
  k = (m + n - 1) / 2 + (m + n - 1) % 2;
  init();
  for (int i = k - 1; i >= 1; i--) {
    for (int x1 = 1; x1 <= n; x1++)
      for (int x2 = 1; x2 <= n; x2++) {
        g[x1][x2] = f[x1][x2];
        f[x1][x2] = 0;
      }
    for (int x1 = 1; x1 <= n; x1++)
      for (int x2 = 1; x2 <= n; x2++) {
        int y1 = i - x1 + 1;
        int y2 = m - (i - (n - x2)) + 1;
        if (s[x1 - 1][y1 - 1] != s[x2 - 1][y2 - 1]) continue;
        for (int t1 = 0; t1 < 2; t1++)
          for (int t2 = 0; t2 < 2; t2++) {
            int cx1 = x1 + dx1[t1];
            int cy1 = y1 + dy1[t1];
            int cx2 = x2 + dx2[t2];
            int cy2 = y2 + dy2[t2];
            if (inside(cx1, cy1) && inside(cx2, cy2) &&
                s[cx1 - 1][cy1 - 1] == s[cx2 - 1][cy2 - 1]) {
              f[x1][x2] += g[cx1][cx2];
              if (f[x1][x2] >= mod) f[x1][x2] -= mod;
            }
          }
      }
  }
  printf("%d", f[1][n]);
}
