/*pku2724*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define _max 3000
int mapmap[_max][_max], N, M, my[_max];
bool visited[_max], num[_max], used[_max][_max];
int n, hash[_max];
int pow0(int k)
{
int ans=1,i;
for(i=1;i<=k;i++)
{
ans*=2;
}
return ans;
}
int change(char *s)//把ch转化为对应的十进制数
{/*
int i;
int num = 0;
for (i = 0; s[i]; i++) {
num += (s[i] == '1' ? (1 << (N - i - 1)) : 0);
}
return num;
* */
int i;
int sum=0;
int len=N;
int k=0;
for(i=len-1;i>=0;i--)
{
if(s[i]=='1')sum+=pow0(k);
k++;
}
return sum;
}
bool find(int x) {
int i;
for (i = 1; i <= n; i++) {
if (!visited[i] && mapmap[x][i]) {
visited[i] = 1;
if (my[i] == -1 || find(my[i])) {
my[i] = x;
return 1;
}
}
}
return 0;
}
int MMG() {
int i, ans = 0;
memset(my, -1, sizeof (my));
for (i = 1; i <= n; i++) {
memset(visited, 0, sizeof (visited));
if (find(i)) ans++;
}
return ans;
}
int main() {
int i, j, k;
char ch[15];
//freopen("a.a", "r", stdin);
while (scanf("%d%d", &N, &M) != EOF) {
if (N == 0 && M == 0)break;
memset(mapmap, 0, sizeof (mapmap));
memset(num, 0, sizeof (num));
memset(hash, 0, sizeof (hash));
for (i = 1; i <= M; i++) {
//cin >> ch;
scanf("%s", ch);
for (j = 0; j < N; j++) {
if (ch[j] == '*')break;
}
if (j < N) {
ch[j] = '1';
int temp = change(ch);
num[temp] = 1;
ch[j] = '0';
temp = change(ch);
num[temp] = 1;
} else {
int temp = change(ch);
num[temp] = 1;
}
}
k = 0;
for (i = 0; i < 2999; i++) {
if (num[i]) {
k++;
hash[k] = i;
}
}
//memset(mapmap, 0, sizeof (mapmap));
for (i = 1; i <= k; i++) {
for (j = 1; j <= k; j++) {
if (i != j) {
int c = hash[i]^hash[j];
if (c && ((c & (c - 1)) == 0)) {
mapmap[i][j] = mapmap[j][i] = 1;
//printf("mapmap[%d][%d]=%d,mapmap[%d][%d]=%d/n", i, j, mapmap[i][j], j, i, mapmap[j][i]);
}
}
}
}
n = k;
int ans = MMG();
cout << k - ans / 2 << endl;
}
return 0;
}