#include<bits/stdc++.h>
typedef int ll;
typedef unsigned long long ull;
using namespace std;
#define pb push_back
int dy[]={0, 0, 1, -1, 1, 1, -1, -1};
int dx[]={1, -1, 0, 0, 1, -1, -1, 1};

#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
#define mp make_pair
#define fi first
#define INF 10000
#define sc second
ll n,m;

char b[600][600];

//vector<vector<ll> > dp;
short dp[510][(1 << 20) + 10];

bool oe[600];

ll dfs(ll i) {
	if(i == n) {
		bool f = true;
		REP(j,m) {
			if(oe[j] == 1) {
				f = false;
			}
		}
		if(f) {
			return 0;
		}
		return -INF;
	}

	ll a = dfs(i + 1);

	char save[600];

	REP(j,m) {
		save[j] = oe[j];
	}

	REP(j,m) {
		oe[j] = (oe[j] xor b[i][j]);
	}

	ll b = dfs(i + 1) + 1;

	REP(j,m) {
		oe[j] = save[j];
	}

	return max(a,b);
}

ll dfs(ll i ,ll S) {
	if(i == n) {
		if(S == 0) {
			return 0;
		}
		return -INF;
	}
	if(dp[i][S] > -INF - 100)
		return dp[i][S];

	ll a = dfs(i + 1,S);

	ll S2 = 0;
	RREP(j,m) {
		S2 *= 2;
		S2 += (((S >> j) & 1) xor b[i][j]);
	}
	ll b = dfs(i + 1,S2) + 1;
	return dp[i][S] = max(a,b);
}

int main(){
	while(true) {
		cin >> n >> m;
		if(n == 0)
			break;
		REP(i,n) 
			cin >> b[i];

		REP(i,n) {
			REP(j,m) {
				b[i][j] -= '0';
			}
		}
		if(m > 20) {
			REP(i,m) {
				oe[i] = 0;
			}
			cout << dfs(0) << endl;
		}else {
			/*dp.clear();
			REP(i,n + 10) {
				vector<ll> v;
				dp.push_back(v);
				REP(j,(1 << m) + 10) 
					dp[i].pb(-INF - 100);
			}*/
			REP(i,n + 1) {
				REP(j,(1 << m) + 1) {
					dp[i][j] = -INF - 100;
				}
			}
			cout << dfs(0,0) << endl;
		}
	}
	return 0;
}

