#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<bitset>
#include<deque>
#include<cstring>
#include<cassert>
#include<climits>

#define REP(i,s,n) for(int i=s;i<n;++i)
#define rep(i,n) REP(i,0,n)

using namespace std;

int n,m,b[510][510];
int pc[1<<24],dp[2][1<<24],bits[510];

void compute() {
  int maxi = 0;
  if( n <= m ) {
    rep(i,(1<<n)) {
      if( maxi >= pc[i] ) continue;
      bool ok = true;
      rep(x,m) {
	int cnt = 0;
	rep(y,n) if( ( (i>>y) & 1 ) && b[y][x] ) ++cnt;
	if( cnt & 1 ) {
	  ok = false;
	  break;
	}
      }
      if( ok ) maxi = max(maxi,pc[i]);
    }
  } else { // n > m
    rep(y,n) {
      bits[y] = 0;
      rep(x,m) if( b[y][x] ) bits[y] = bits[y] | (1<<x);
    }
    memset(dp,-1,sizeof dp);
    dp[0][0] = 0;
    rep(y,n) {
      rep(i,(1<<m)) dp[(y+1)&1][i] = -1;
      rep(state,(1<<m)) if( dp[y&1][state] != -1 ) {
	dp[(y+1)&1][state] = max(dp[(y+1)&1][state],dp[y&1][state]);
	dp[(y+1)&1][state^bits[y]] = max(dp[(y+1)&1][state^bits[y]],dp[y&1][state]+1);
      }
    }
    if( dp[n&1][0] != -1 ) maxi = dp[n&1][0];
  }
  cout << maxi << endl;
}

int main() {
  rep(i,(1<<23)) pc[i] = __builtin_popcount(i);
  while( cin >> n >> m, n|m ) {
    rep(i,n) {
      string s;
      cin >> s;
      rep(j,m) b[i][j] = ( s[j] == '1' );
    }
    compute();
  }
  return 0;
}