#include <bits/stdc++.h>
using namespace std;
inline char skipwhitespace() {
  char ch = getchar();
  while (ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t') ch = getchar();
  return ch;
}
void gi(int &x) {
  register int c = getchar();
  x = 0;
  int sn = 1;
  for (; (c < 48 || c > 57); c = getchar())
    if (c == '-') sn = -1;
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  x *= sn;
}
void gii(long long int &x) {
  register long long int c = getchar();
  x = 0;
  long long int sn = 1;
  for (; (c < 48 || c > 57); c = getchar())
    if (c == '-') sn = -1;
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  x *= sn;
}
void wi(int n) {
  int sign = n >= 0 ? 1 : -1;
  n = n > 0 ? n : -n;
  char buf[10];
  int i = 9;
  if (!n) buf[i--] = 48;
  while (n) {
    buf[i--] = n % 10 + 48;
    n /= 10;
  }
  if (sign < 0) printf("%c", '-');
  while (++i < 10) printf("%c", buf[i]);
}
void wii(long long int n) {
  long long int sign = n >= 0 ? 1 : -1;
  n = n > 0 ? n : -n;
  char buf[25];
  long long int i = 24;
  if (!n) buf[i--] = 48;
  while (n) {
    buf[i--] = n % 10 + 48;
    n /= 10;
  }
  if (sign < 0) printf("%c", '-');
  while (++i < 25) printf("%c", buf[i]);
}
int gs(char *s) {
  char ch = skipwhitespace();
  int n = 0;
  while ((ch != '\n' && ch != ' ' && ch != '\t')) {
    s[n++] = ch;
    ch = getchar();
  }
  s[n] = 0;
  return n;
}
void ws(char *s) {
  char *p = s;
  while (*p) {
    printf("%c", *p);
    p++;
  }
}
int dx[] = {1, 0};
int dy[] = {0, 1};
char str[505][505];
int dp[2][505][505], n, m, sum, ans = 0;
bool check(int i1, int j1, int i2, int j2) {
  return (i1 <= n && j1 <= m && i2 >= 1 && j2 >= 1 && i2 - i1 >= 0 &&
          j2 - j1 >= 0 && str[i1][j1] == str[i2][j2]);
}
int main() {
  gi(n);
  gi(m);
  for (int i = 1; i <= n; i++) gs(str[i] + 1);
  dp[1][1][n] = 1;
  sum = n + m + 2;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      for (int k = i; k <= n; k++) dp[(i + 1) % 2][j][k] = 0;
    for (int j = 1; j <= m; j++)
      for (int k = i; k <= n; k++) {
        int l = sum - i - j - k;
        if (check(i, j, k, l)) {
          if (abs(i - k) + abs(j - l) <= 1) {
            ans = (ans + dp[i % 2][j][k]) % 1000000007;
            continue;
          }
          dp[i % 2][j + 1][k] =
              (dp[i % 2][j + 1][k] + dp[i % 2][j][k]) % 1000000007;
          dp[i % 2][j + 1][k - 1] =
              (dp[i % 2][j + 1][k - 1] + dp[i % 2][j][k]) % 1000000007;
          dp[(i + 1) % 2][j][k] =
              (dp[(i + 1) % 2][j][k] + dp[i % 2][j][k]) % 1000000007;
          dp[(i + 1) % 2][j][k - 1] =
              (dp[(i + 1) % 2][j][k - 1] + dp[i % 2][j][k]) % 1000000007;
        }
      }
  }
  wi(ans);
  printf("\n");
}
