#include <bits/stdc++.h>
using namespace std;
char a[500][501];
int d[1000], d1[1000], f[500][500];
long long **s = new long long *[500], **s1 = new long long *[500], **s2;
int main() {
  int q, w, qw, e, e1, e2, r, r1, r2, t, c, v, p = 1000000007;
  cin >> q >> w;
  qw = q + w - 1;
  for (e = 0; e < q; e++) {
    scanf("%s", a[e]);
    s[e] = new long long[w];
    s1[e] = new long long[w];
    for (r = 0; r < w; r++) s1[e][r] = 0;
  }
  if (q + w == 2) {
    cout << 1;
    return 0;
  }
  for (e = 0; e < qw; e++) {
    d[e] = 0;
    d1[e] = 0;
  }
  for (r = 0; r < w; r++)
    for (e = 0; e < q; e++) {
      f[e][r] = d[e + r];
      d[e + r]++;
      d1[e + r] = max(e, d1[e + r]);
    }
  if (qw % 2 == 1) {
    c = qw / 2 - 1;
    v = c + 2;
    for (e = 0; e < d[c + 1]; e++) s1[e][e] = 1;
  } else {
    c = qw / 2 - 2;
    v = c + 3;
    t = qw / 2 - 1;
    for (e = 0; e < q; e++)
      for (r = 0; r < w; r++)
        if (e + r == t) {
          if ((e + 1 < q) && (a[e][r] == a[e + 1][r]))
            s1[f[e][r]][f[e + 1][r]] = 1;
          if ((r + 1 < w) && (a[e][r] == a[e][r + 1]))
            s1[f[e][r]][f[e][r + 1]] = 1;
        }
  }
  for (; (0 <= c) && (v < qw); c--, v++) {
    for (e = 0, e1 = d1[c], e2 = c - d1[c]; e < d[c]; e++, e1--, e2++)
      for (r = 0, r1 = d1[v], r2 = v - d1[v]; r < d[c]; r++, r1--, r2++) {
        s[e][r] = 0;
        if (a[e1][e2] == a[r1][r2]) {
          if (e1 + 1 < q) {
            if (r1 - 1 >= 0) s[e][r] += s1[f[e1 + 1][e2]][f[r1 - 1][r2]];
            if (r2 - 1 >= 0) s[e][r] += s1[f[e1 + 1][e2]][f[r1][r2 - 1]];
          }
          if (e2 + 1 < w) {
            if (r1 - 1 >= 0) s[e][r] += s1[f[e1][e2 + 1]][f[r1 - 1][r2]];
            if (r2 - 1 >= 0) s[e][r] += s1[f[e1][e2 + 1]][f[r1][r2 - 1]];
          }
        }
        while (s[e][r] >= p) s[e][r] -= p;
      }
    s2 = s1;
    s1 = s;
    s = s2;
  }
  cout << s1[0][0];
  return 0;
}
