#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<deque>
#include<stack>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
char g[11][11], g_[11][11];
int n;
const int N = 11;
int check(char g[][N], char g_[][N]) {
int mark = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g[i][j] == g_[j][n + 1 - i]) {
continue;
}
else {
mark = 0;
break;
}
}
}
if (mark) {
return 1;
}
mark = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g[i][j] == g_[n + 1 - i][n + 1 - j]) {
continue;
}
else {
mark = 0;
break;
}
}
}
if (mark) {
return 2;
}
mark = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g_[i][j] == g[j][n + 1 - i]) {
continue;
}
else {
mark = 0;
break;
}
}
}
if (mark) {
return 3;
}
mark = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g[i][j] == g_[i][n + 1 - j]) {
continue;
}
else {
mark = 0;
break;
}
}
}
if (mark) {
return 4;
}
char t[11][11];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
t[i][j] = g[i][n + 1 - j];
}
}
if (check(t, g_) <= 3) {
return 5;
}
mark = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g[i][j] == g_[i][j]) {
continue;
}
else {
mark = 0;
break;
}
}
}
if (mark) {
return 6;
}
return 7;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> g[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> g_[i][j];
}
}
printf("%d", check(g, g_));
}