#include <bits/stdc++.h>
using namespace std;
int w;

map<vector<int>,int> mem;
int dfs(vector<int> &A){
  int n = A.size();  
  if(n<=1) return 0;
  if(mem.count(A)) return mem[A];
  
  int res = A.size()-1;
  for(int i=0;i<w;i++){
    vector<int> T,F;
    for(int j=0;j<n;j++) (A[j]>>i&1)? T.push_back(A[j]) : F.push_back(A[j]);
    if(T.empty() || F.empty()) continue;
    res = min(res,max(dfs(T),dfs(F))+1);
  } 
  return mem[A] = res;
}

int BtoI(string a){
  int res = 0;
  for(int i=0;i<(int)a.size();i++) res = res*2+a[i]-'0';
  return res;
}

int main(){

  while(1){
    int n;
    cin>>w>>n;
    if(w==0&&n==0)break;
    vector<int> A;
    A.resize(n);
    for(int i=0;i<n;i++){
      string s;
      cin>>s;
      A[i] = BtoI(s);
    }
    mem.clear();
    cout<<dfs(A)<<endl;
  }
  return 0;
}