#include <bits/stdc++.h>
using namespace std;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
void fast() {
  ios_base::sync_with_stdio(NULL);
  cin.tie(0);
  cout.tie(0);
}
void online_judge() {
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
}
const int flag_max = 0x3f3f3f3f;
const long long OO = 2e9 + 10;
const double EPS = (1e-8);
int dcmp(double x, double y) { return fabs(x - y) <= EPS ? 0 : x < y ? -1 : 1; }
long long gcd(long long a, long long b) { return !b ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return (a / gcd(a, b)) * b; }
const long long MOD = 1e14 + 7;
long long Power(long long n, long long deg) {
  if (!deg)
    return 1;
  else if (deg & 1)
    return (Power(n, deg - 1) * n);
  else {
    long long half = Power(n, deg / 2);
    return ((half * half));
  }
}
int n, m;
vector<string> row;
void mirrorings(int sz, vector<string>& now) {
  if (sz == n) return;
  for (int i = now.size() - 1; i >= 0; i--) now.push_back(now[i]);
  if (n % (int)now.size() == 0) mirrorings(2 * sz, now);
}
bool check(vector<string> carry) {
  for (int i = 0; i < row.size(); i++)
    if (row[i] != carry[i]) return 0;
  return 1;
}
int main() {
  fast();
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    string now = "";
    for (int j = 0; j < m; j++) {
      char X;
      cin >> X;
      now += X;
    }
    row.push_back(now);
  }
  int ans = n;
  vector<string> flag;
  for (int i = 0; i < n; i++) {
    flag.push_back(row[i]);
    vector<string> now = flag;
    if (n % (int)flag.size() == 0) {
      mirrorings(flag.size(), now);
      if (check(now)) ans = i + 1, i = n;
    }
  }
  cout << ans;
  return 0;
}
