#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<sstream>
using namespace std;
const int maxn = 128;
const int maxm = 11;
const int INF = 1000000000;
int kase, n, m;
char objects[maxn][maxm + 100];
int vis[1 << maxm][1 << maxm], d[1 << maxm][1 << maxm];
int cnt[1 << maxm][1 << maxm];
int dp(int s, int a) {
if (cnt[s][a] <= 1)return 0;
if (cnt[s][a] == 2)return 1;
int &ans = d[s][a];
if (vis[s][a] == kase)return ans;
vis[s][a] = kase;
ans = m;
for (int k = 0; k < m; k++) {
if (!(s&(1 << k))) {
int s2 = s | (1 << k), a2 = a | (1 << k);
if (cnt[s2][a2] >= 1 && cnt[s2][a] >= 1) {
int need = max(dp(s2, a2), dp(s2, a) + 1);
ans = min(ans, need);
}
}
}
return ans;
}
void init() {
for (int s = 0; s < (1 << m); s++) {
for (int s0 = s; s0; (s0 - 1)&s) {
cnt[s][s0] = 0;
}
cnt[s][0] = 0;
}
for (int i = 0; i < n; i++) {
int features = 0;
for (int f = 0; f < m; f++) {
if (objects[i][f] == '1')features |= (1 << f);
}
for (int s = 0; s < (1 << m); s++)
cnt[s][s&features]++;
}
}
int main() {
memset(vis, 0, sizeof(vis));
while (cin >> m >> n && n) {
++kase;
for (int i = 0; i < n; i++)cin >> objects[i];
init();
cout << dp(0, 0) << endl;
}
return 0;
}