#include <stdio.h>
#include <string.h>
#include <limits.h>

int b[501][501];
int B[501];
int sum[501];
int dp[30][1<<22];


int main(void){
	int n, m, ans, count;
	int flag = 1;

	while(1){
		scanf("%d %d", &n, &m);
		if(n == 0 && m== 0) break;

////////////////////////////////////////////////////////
		if(n<22){
			/*input*/
			for(int i=0; i<n; i++){
				for(int j=0; j<m; j++){
					scanf(" %c", &b[i][j]);
					b[i][j] -= '0';
				}
			}

			ans = 0;
			for(int i=0; i<(1<<n); i++){
				count = 0;
				memset(sum, 0, sizeof(sum));
				for(int j=0; j<n; j++){
					if((i>>j)%2 == 0){
						count++;
						for(int k=0; k<m; k++) sum[k] += b[j][k];
					}
				}

				flag = 1;
				for(int k=0; k<m; k++){
					if(sum[k]%2 == 1){
						flag = 0;
						break;
					}
				}
				if(flag == 1 && ans < count) ans = count;
			}
			printf("%d\n", ans);
/////////////////////////////////////////////////////////////
		} else{
			/*input*/
			for(int i=0; i<n; i++){
				B[i] = 0;
				for(int j=0; j<m; j++){
					scanf(" %c", &b[i][j]);
					b[i][j] = b[i][j] - '0';
					B[i] += (b[i][j] << j);
				}
			}

			for(int i=0; i<n+5; i++){
				for(int j=0; j<(1<<m); j++){
					dp[i][j] = INT_MIN;
				}
			}

			dp[0][0] = 0;
			for(int i=0; i<n; i++){
				for(int j=0; j<(1<<m); j++){
					if(dp[i][j] < 0) continue;
					if(dp[i+1][j] < dp[i][j]) dp[i+1][j] = dp[i][j];
					if(dp[i+1][j^B[i]] < dp[i][j] + 1) dp[i+1][j^B[i]] = dp[i][j] + 1;
				}
			}
			ans = dp[n][0];
			printf("%d\n", ans);
		}
////////////////////////////////////////////////////////////////
	}//endwhile
	return 0;
}

