#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
  for(;;) {
    int n, m;
    cin >> n >> m;
    if(n == 0 && m == 0) break;
    vector<vector<bool>> bs;
    for(int i = 0; i < n; i++) {
      string str;
      cin >> str;
      vector<bool> v;
      for(int j = 0; j < m; j++) {
        v.push_back(str[j] == '1');
      }
      bs.push_back(move(v));
    }
    if(n <= 20) { // recipie < stuff  -> all possible combinations of recipes!
      const int nn = 1 << n;
      int mxc = 0;
      for(int i = 0; i < nn; i++) {
        vector<bool> ss(m, false);
        int c = 0;
        for(int j = 1, ii = 0; j < nn; j<<=1, ii++) {
          if(i & j) {
            c++;
            for(int k = 0; k < m; k++) {
              ss[k] = ss[k] ^ bs[ii][k];
            }
          }
        }
        bool ng = false;
        for(int k = 0; k < m; k++) {
          if(ss[k]) {
            ng = true;
            break;
          }
        }
        if(!ng) {
          if(mxc < c) mxc = c;
        }
      }
      cout << mxc << endl;
    } else { // recipie >= stuff  -> all possible states of odd stuff
      const int mm = 1 << m;
      vector<int> ms;
      for(int i = 0; i < n; i++) {
        int msk = 0;
        for(int j = 1, ii = 0; j < mm; j<<=1, ii++) {
          if(bs[i][ii]) msk |= j;
        }
        ms.push_back(msk);
      }
      vector<int> ss(mm, -1);
      ss[0] = 0;
      for(int i = 0; i < n; i++) { // using recipe i.
        vector<int> tt(mm, -1);
        for(int j = 0; j < mm; j++) {
          if(ss[j] < 0) continue;
          if(tt[j] < ss[j]) tt[j] = ss[j];
          int k = j ^ ms[i];
          if(tt[k] < ss[j] + 1) {
            tt[k] = ss[j] + 1;
          }
        }
        ss = move(tt);
      }
      cout << ss[0] << endl;
    }
  }
  return 0;
}