#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
long long dp[2][503][503];
char arr[510][510];
int n, m;
long long mod(long long x) { return (x % 1000000007); }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) scanf(" %c", &arr[i][j]);
  for (int num = n + m - 1; num >= 1; num--) {
    int id = num & 1;
    for (int x = 1; x <= n; x++)
      for (int z = 1; z <= n; z++) {
        int y = 1 + (num - (x - 1) - 1);
        int t = m - (num - (n - z) - 1);
        long long& ret = dp[id][x][z];
        ret = 0;
        if (x > z or y > t or arr[x][y] != arr[z][t]) {
          ret = 0LL;
          continue;
        }
        if (((x == z) and (y == t)) or ((x + 1 == z) and (y == t)) or
            ((x == z) and (y + 1 == t))) {
          ret = 1LL;
          continue;
        }
        ret = mod(ret + dp[id ^ 1][x + 1][z - 1]);
        ret = mod(ret + dp[id ^ 1][x + 1][z]);
        ret = mod(ret + dp[id ^ 1][x][z - 1]);
        ret = mod(ret + dp[id ^ 1][x][z]);
      }
  }
  printf("%lld\n", mod(dp[1][1][n]));
  return 0;
}
