#include <cstdio>
// On joue sur le fait qu'une ligne (15 pixels) peut être représenté (en
// pratique) par un unsigned int, l'application du pinceau revenant à
// effectuer quelques xor.
// L'algo est assez simple (et assez exponentiel aussi, snif), on génere
// toutes les premieres lignes possibles à partir des quelles on peut en
// déduire la suite de l'image.
const unsigned int maxy=1000000;
int main(){
unsigned int n, m;
std::scanf("%u %u\n", &n, &m);
unsigned int pic[maxy]={0};
for(unsigned int i=0; i<n; ++i){
for(unsigned int j=0; j<m; ++j){
// Le non formaté, c'est rapide :
pic[i] |= (std::getchar() -'0')<<j;
std::getchar();
}
std::getchar();
}
// rm: le masque, il va permettre de supprimer les modifications hors
// image qui entraineraient des flips de pixels en trop sur le bord droit.
unsigned int rm = (1U<<m)-1;
// On genere d'abbord ce que chaque application sur la premiere ligne engendre sur
// la derniere en supposant que l'image soit toute blanche.
unsigned int impl[15];
for(unsigned int i=0; i<m; ++i){
impl[i]=1<<i;
unsigned next=impl[i];
impl[i]^=impl[i]<<1&rm^impl[i]>>1;
for(unsigned int j=1; j<n; ++j){
unsigned tmp=impl[i];
impl[i]^=next^impl[i]<<1&rm^impl[i]>>1;
next=tmp;
}
}
// Qu'obtient t'on sur la derniere ligne si on ne fait aucune application sur la premiere.
unsigned res=0;
unsigned next=0;
for(unsigned int k=1; k<n; ++k){
unsigned int dif = pic[k-1]^res;
res = next^dif^dif<<1&rm^dif>>1;
next = dif;
}
// On essaye toutes les modifications possibles sur la premiere ligne, une
// modification étant un unsigned int, il suffit de jouer sur la
// représentation de ceux ci.
for(unsigned int i=0; i<1U<<m; ++i){
unsigned int fin=res;
for(unsigned int j=0; j<m; ++j)
if(i>>j&1)
fin^=impl[j];
if(fin==pic[n-1]){
std::putchar('1');
std::putchar('\n');
return 0;
}
}
std::putchar('0');
std::putchar('\n');
}