#include<stdio.h>
#include<vector>
using namespace std;
struct tri {int next[4];}node[500*500];
int nn = 1;
char A[515][515], B[515][515];
vector<int>dep[515];
int trans[256];
int min(int a, int b) { if (a > b)return b; return a; }
int max(int a, int b) { if (a > b)return a; return b; }
int main() {
int n, m, i, j, k;
int ans = 1e9;
trans['A'] = 0, trans['C'] = 1, trans['G'] = 2, trans['T'] = 3;
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++) scanf("%s", A[i]);
for (i = 0; i < n; i++) scanf("%s", B[i]);
for (i = 0; i < m; i++) {
node[1] = { {0,0,0,0} }, nn = 1;
for (j = 0; j < n; j++) {
int now = 1;
for (k = i; k < m; k++) {
if (!node[now].next[trans[A[j][k]]])
node[now].next[trans[A[j][k]]] = ++nn, node[nn] = { {0,0,0,0} };
now = node[now].next[trans[A[j][k]]];
}
}
int res = 0;
for (j = 0; j < n; j++) {
int now = 1;
int dep = 0;
for (k = i; k < m; k++,dep++) {
if (!node[now].next[trans[B[j][k]]])break;
now = node[now].next[trans[B[j][k]]];
}
if (k == m)res = 1e9;
res = max(res, dep + 1);
}
ans = min(ans, res);
}
printf("%d", ans);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgdHJpIHtpbnQgbmV4dFs0XTt9bm9kZVs1MDAqNTAwXTsKaW50IG5uID0gMTsKY2hhciBBWzUxNV1bNTE1XSwgQls1MTVdWzUxNV07CnZlY3RvcjxpbnQ+ZGVwWzUxNV07CmludCB0cmFuc1syNTZdOwppbnQgbWluKGludCBhLCBpbnQgYikgeyBpZiAoYSA+IGIpcmV0dXJuIGI7IHJldHVybiBhOyB9CmludCBtYXgoaW50IGEsIGludCBiKSB7IGlmIChhID4gYilyZXR1cm4gYTsgcmV0dXJuIGI7IH0KaW50IG1haW4oKSB7CglpbnQgbiwgbSwgaSwgaiwgazsKCWludCBhbnMgPSAxZTk7Cgl0cmFuc1snQSddID0gMCwgdHJhbnNbJ0MnXSA9IDEsIHRyYW5zWydHJ10gPSAyLCB0cmFuc1snVCddID0gMzsKCXNjYW5mKCIlZCVkIiwgJm4sICZtKTsKCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHNjYW5mKCIlcyIsIEFbaV0pOwoJZm9yIChpID0gMDsgaSA8IG47IGkrKykgc2NhbmYoIiVzIiwgQltpXSk7Cglmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJbm9kZVsxXSA9IHsgezAsMCwwLDB9IH0sIG5uID0gMTsKCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CgkJCWludCBub3cgPSAxOwoJCQlmb3IgKGsgPSBpOyBrIDwgbTsgaysrKSB7CgkJCQlpZiAoIW5vZGVbbm93XS5uZXh0W3RyYW5zW0Fbal1ba11dXSkKCQkJCQlub2RlW25vd10ubmV4dFt0cmFuc1tBW2pdW2tdXV0gPSArK25uLCBub2RlW25uXSA9IHsgezAsMCwwLDB9IH07CgkJCQlub3cgPSBub2RlW25vd10ubmV4dFt0cmFuc1tBW2pdW2tdXV07CgkJCX0KCQl9CgkJaW50IHJlcyA9IDA7CgkJZm9yIChqID0gMDsgaiA8IG47IGorKykgewoJCQlpbnQgbm93ID0gMTsKCQkJaW50IGRlcCA9IDA7CgkJCWZvciAoayA9IGk7IGsgPCBtOyBrKyssZGVwKyspIHsKCQkJCWlmICghbm9kZVtub3ddLm5leHRbdHJhbnNbQltqXVtrXV1dKWJyZWFrOwoJCQkJbm93ID0gbm9kZVtub3ddLm5leHRbdHJhbnNbQltqXVtrXV1dOwoJCQl9CgkJCWlmIChrID09IG0pcmVzID0gMWU5OwoJCQlyZXMgPSBtYXgocmVzLCBkZXAgKyAxKTsKCQl9CgkJYW5zID0gbWluKGFucywgcmVzKTsKCX0KCXByaW50ZigiJWQiLCBhbnMpOwoJcmV0dXJuIDA7Cn0=