#include <bits/stdc++.h>
using namespace std;
int r, c, x, y, ans;
char mat[30][30];
void update(int i, int j) {
  int ij = i * j, xy = x * y;
  if ((ij < xy) || ((ij == xy) && (i < x))) {
    x = i, y = j;
  }
  ++ans;
}
pair<long long, long long> hv(int oi, int oj, int h, int w) {
  pair<long long, long long> r = pair<long long, long long>(0, 0);
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      r.first = 31 * r.first + mat[oi + i][oj + j];
      r.second = 31 * r.second + mat[oi + h - 1 - i][oj + w - 1 - j];
    }
  }
  return r;
}
pair<long long, long long> vh(int oi, int oj, int h, int w) {
  pair<long long, long long> r = pair<long long, long long>(0, 0);
  for (int j = 0; j < w; ++j) {
    for (int i = 0; i < h; ++i) {
      r.first = 31 * r.first + mat[oi + h - 1 - i][oj + j];
      r.second = 31 * r.second + mat[oi + i][oj + w - 1 - j];
    }
  }
  return r;
}
bool good(int h, int w) {
  if ((h == r) && (w == c)) return true;
  unordered_set<long long> conj[2];
  pair<long long, long long> aux[2];
  for (int i = 1; i <= r; i += h) {
    for (int j = 1; j <= c; j += w) {
      aux[0] = hv(i, j, h, w);
      aux[1] = vh(i, j, h, w);
      if (conj[0].count(aux[0].first)) return false;
      if (conj[0].count(aux[0].second)) return false;
      if (h == w) {
        if (conj[0].count(aux[1].first)) return false;
        if (conj[0].count(aux[1].second)) return false;
        conj[0].insert(aux[1].first);
        conj[0].insert(aux[1].second);
      } else {
        if (conj[1].count(aux[1].first)) return false;
        if (conj[1].count(aux[1].second)) return false;
        conj[1].insert(aux[1].first);
        conj[1].insert(aux[1].second);
      }
      conj[0].insert(aux[0].first);
      conj[0].insert(aux[0].second);
    }
  }
  return true;
}
int main() {
  scanf("%d%d", &r, &c);
  memset(mat, '.', sizeof(mat));
  for (int i = 1; i <= r; ++i) {
    scanf("%s", (mat[i] + 1));
  }
  ans = 0;
  x = y = 100;
  for (int i = 1; i <= r; ++i) {
    if ((r % i) == 0) {
      for (int j = 1; j <= c; ++j) {
        if ((c % j) == 0) {
          if (good(i, j)) {
            update(i, j);
          }
        }
      }
    }
  }
  printf("%d\n%d %d\n", ans, x, y);
  return 0;
}
