#include <bits/stdc++.h>
using namespace std;
const int INF = 2147483647;
const double PI = 3.141592653589793;
const int N = 22;
int tab[N][N], bat1[N][N], bat2[N][N], i, j, a, b, k, l, m, n, bestx, bestp, k1,
    k2, res, da;
char t[N];
bool same2(int w1, int w2) {
  int i, j;
  for (i = 0; i < w1; i++)
    for (j = 0; j < w2; j++)
      if (bat2[i][j] != bat1[i][j]) return false;
  return true;
}
bool rozne(int a, int b, int c, int d, int w1, int w2) {
  int i, j;
  for (i = 0; i < w1; i++)
    for (j = 0; j < w2; j++) bat1[i][j] = tab[a + i][b + j];
  for (i = 0; i < w1; i++)
    for (j = 0; j < w2; j++) bat2[i][j] = tab[c + i][d + j];
  if (same2(w1, w2)) return false;
  for (i = 0; i < w1; i++)
    for (j = 0; j < w2; j++) bat2[i][j] = tab[c + w1 - 1 - i][d + w2 - 1 - j];
  if (same2(w1, w2)) return false;
  if (w1 == w2) {
    for (i = 0; i < w1; i++)
      for (j = 0; j < w2; j++) bat2[i][j] = tab[c + j][d + w2 - 1 - i];
    if (same2(w1, w2)) return false;
    for (i = 0; i < w1; i++)
      for (j = 0; j < w2; j++) bat2[i][j] = tab[c + w1 - 1 - j][d + i];
    if (same2(w1, w2)) return false;
  }
  return true;
}
int main() {
  scanf("%d %d", &a, &b);
  for (i = 0; i < a; i++) {
    scanf("%s", &t);
    for (j = 0; j < b; j++) {
      tab[i][j] = int(t[j]) - 'A';
    }
  }
  res = 0;
  bestp = INF;
  for (i = 1; i <= a; i++)
    for (j = 1; j <= b; j++)
      if (a % i == 0 && b % j == 0) {
        k1 = a / i;
        k2 = b / j;
        da = 1;
        for (k = 0; k < a; k += i)
          for (l = 0; l < b; l += j)
            for (m = k; m < a; m += i)
              for (n = ((m == k) ? l + j : 0); n < b; n += j)
                if (!rozne(k, l, m, n, i, j)) da = 0;
        if (da) {
          res++;
          if (i * j < bestp || (i * j == bestp && i < bestx)) {
            bestp = i * j;
            bestx = i;
          }
        }
      }
  printf("%d\n%d %d\n", res, bestx, bestp / bestx);
  return 0;
}
