Magnus decided to play a classic chess game. Though what he saw in his locker shocked him! His favourite chessboard got broken into 4 pieces, each of size n by n, n is always odd. And what's even worse, some squares were of wrong color. j-th square of the i-th row of k-th piece of the board has color ak, i, j; 1 being black and 0 being white. 

Now Magnus wants to change color of some squares in such a way that he recolors minimum number of squares and obtained pieces form a valid chessboard. Every square has its color different to each of the neightbouring by side squares in a valid board. Its size should be 2n by 2n. You are allowed to move pieces but not allowed to rotate or flip them.

Input

The first line contains odd integer n (1 ≤ n ≤ 100) — the size of all pieces of the board. 

Then 4 segments follow, each describes one piece of the board. Each consists of n lines of n characters; j-th one of i-th line is equal to 1 if the square is black initially and 0 otherwise. Segments are separated by an empty line.

Output

Print one number — minimum number of squares Magnus should recolor to be able to obtain a valid chessboard.

Examples

Input

1
0

0

1

0


Output

1


Input

3
101
010
101

101
000
101

010
101
011

010
101
010


Output

2
import java.util.*;
import java.io.*;

public class C961 {
	static int n;
	static char[][][] board;
	public static void main(String[] args) throws Exception {

		st = new StringTokenizer(in.readLine());
		n = i();
		board = new char[4][n][n];

		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < n; j++) {
				board[i][j] = in.readLine().toCharArray();
			}

			if (i < 3) in.readLine();			
		}

		int min = 1 << 27;

		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				if (j == i) continue;
				for (int k = 0; k < 4; k++) {
					if (k == i || k == j) continue;
					for (int l = 0; l < 4; l++) {
						if (l == i || l == j || l == k) continue;
						min = Math.min(min, diff(i, j, k, l, 0));
						min = Math.min(min, diff(i, j, k, l, 1));
					}
				}
			}
		}

		out.println(min);
		
		out.close();
	}

	static int diff(int tl, int tr, int bl, int br, int flag) {
		int diff = 0;

		for (int r = 0; r < n; r++) {
			for (int c = 0; c < n; c++) {
				if (board[tl][r][c] != '1' - (r + c & 1) + flag) diff++;
				if (board[br][r][c] != '1' - (r + c & 1) + flag) diff++;
				if (board[tr][r][c] != '1' - (r + c + 1 & 1) + flag) diff++;
				if (board[bl][r][c] != '1' - (r + c + 1 & 1) + flag) diff++;
			}
		}
		return diff;
	}

	static BufferedReader in;
	static StringTokenizer st;
	static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
	static {
		try {
			in = new BufferedReader(new FileReader("cf.in"));
		} catch (Exception e) {
			in = new BufferedReader(new InputStreamReader(System.in));
		}
	}
	static int i() {return Integer.parseInt(st.nextToken());}
	static double d() {return Double.parseDouble(st.nextToken());}
	static String s() {return st.nextToken();}
	static long l() {return Long.parseLong(st.nextToken());}
}
