#include <iostream>
#include <string>
using namespace std;
int N, M;
void turn(int A[][50], int N, int M);
bool same(int A[][50], int B[][50]);
int main() {
cin >> N >> M;
int A[50][50] = { 0 };
int B[50][50] = { 0 };
for (int i = 0; i < N; i++) {
string s;
cin >> s;
for (int j = 0; j < M; j++) {
if (s[j] == '0') { A[i][j] = 0; }
else { A[i][j] = 1; }
}
}
for (int i = 0; i < N; i++) {
string s;
cin >> s;
for (int j = 0; j < M; j++) {
if (s[j] == '0') { B[i][j] = 0; }
else { B[i][j] = 1; }
}
}
if (N < 3 || M < 3) {
if (same(A, B) == true)
cout << 0;
else
cout << -1;
}
int count = 0;
bool check = false;
for (int i = 0; i <= N - 3; i++) {
for (int j = 0; j <= M - 3; j++) {
turn(A, i, j);
count++;
check = same(A, B);
if (check == true) {
cout << count;
return 0;
}
}
}
if (check == false)
cout << -1;
}
void turn(int A[][50], int a, int b) {
for (int i = a; i < a + 3; i++) {
for (int j = b; j < b + 3; j++) {
if (A[i][j] == 0)
A[i][j] = 1;
else if (A[j][j] == 1)
A[i][j] = 0;
}
}
}
bool same(int A[][50], int B[][50]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (A[i][j] != B[i][j]) {
return false;
}
}
}
return true;
}