#include<bits/stdc++.h>
using namespace std;
     
int n,m,b[510][510];
string s[510];
int dp[2][1<<24];
     
void compute() {
  int maxi = 0;
  if( n <= m ) {
    for(int i=0;i<(1<<n);i++){
        bool ok=1;
        for(int j=0;j<m;j++){
          int cont=0;
          for(int k=0;k<n;k++){
            if((i>>k)&1 && b[k][j])++cont;
          }
          if(cont&1){
            ok=0;
            break;
          }
        }
        if(ok)maxi=max(maxi,__builtin_popcount(i));
      }
  } else { // n > m
   int list[501];
      fill(list,list+n,0);
      for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
          if(b[i][j]){
            list[i]=list[i]|(1<<j);
          }
        }
      }
      for(int i=0;i<2;i++)for(int j=0;j<(1<<m);j++)dp[i][j]=-1;
      dp[0][0]=0;
      for(int i=0;i<n;i++){
        for(int j=0;j<(1<<m);j++)dp[(i+1)&1][j]=-1;
        for(int j=0;j<(1<<m);j++){
          if(dp[i&1][j]==-1)continue;
          dp[(i+1)&1][j^list[i]]=max(dp[(i+1)&1][j^list[i]],dp[i&1][j]+1);
          dp[(i+1)&1][j]=max(dp[(i+1)&1][j],dp[i&1][j]);
        }
      }
      if(dp[n&1][0]!=-1)maxi=dp[n&1][0];
  }
  cout << maxi << endl;
}
     
int main() {
  while( cin >> n >> m, n ) {
    for(int i=0;i<n;i++) {
      cin >> s[i];
      for(int j=0;j<m;j++)b[i][j] = ( s[i][j] == '1' );
    }
    compute();
  }
  return 0;
}
