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
// CodeForces Round #667 B competition

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Array;
import java.util.Arrays;

public class Chessboard {
	
	class Square implements Comparable<Square> {
		int [][]m;
		int difSd;
		int difSnd;
		int ddif;
		
		Square() {
			m = new int[n][n];
		}
		
		void readSquare(BufferedReader bin) throws IOException {
			for (int i=0; i<n; i++) {
				String s = bin.readLine();
				for (int j=0; j<n; j++) {
					m[i][j] = (int)(s.charAt(j) - '0');
				}				
			}
		}
		
		void setSquare(boolean diag) {
			for (int i=0; i<n; i++) {
				for (int j=0; j<n; j++) {
					int d = (i + j) % 2;
					m[i][j] = (diag ? 1-d : d);
				}				
			}
		}
		
		int diff(Square b) {
			int df = 0;
			for (int i=0; i<n; i++) {
				for (int j=0; j<n; j++) {
					df += (m[i][j] == b.m[i][j] ? 0 : 1);
				}
			}
			return df;
		}
		
		void countDiffs() {
			difSd = diff(sd);
			difSnd = diff(snd);		
			ddif = difSd - difSnd;
		}

		@Override
		public int compareTo(Square o) {
			return ddif - o.ddif;
		}		
	}

	int n;
	Square []sqs;
	Square sd, snd;
	int minSq;

	private void readData(BufferedReader bin) throws IOException {
		String s = bin.readLine();
		String []ss = s.split(" ");
		n = Integer.parseInt(ss[0]);
		// read a
		sd = new Square();
		snd = new Square();
		sd.setSquare(true);
		snd.setSquare(false);
		sqs = new Square[4];
		for (int i=0; i<4; i++) {
			sqs[i] = new Square();
			sqs[i].readSquare(bin);
			sqs[i].countDiffs();
			if (i<3) {
				bin.readLine();
			}
		}
	}

	void printRes() {
		System.out.println(minSq);
	}	

	private void calculate() {
		Arrays.sort(sqs);
		// 0,1 - diag, 2, 3 - not diag
		minSq = sqs[0].difSd + sqs[1].difSd;
		minSq += sqs[2].difSnd + sqs[3].difSnd;		
	}

	public static void main(String[] args) throws IOException {
		// BufferedReader bin = new BufferedReader(new FileReader("cactus.in"));
		BufferedReader bin = new BufferedReader(
				new InputStreamReader(System.in));
		Chessboard l = new Chessboard();
		l.readData(bin);
		l.calculate();
		l.printRes();
	}
}
