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.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;

public class Main{
    public static class Cuadro{
	char p[][];
	int malB;
	int malN;
	Cuadro(char p[][], int malB, int malN){
	    this.p = p;
	    this.malB = malB;
	    this.malN = malN;
	}
    }

    public static void main(String[] args)throws IOException{
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	PrintWriter out = new PrintWriter(System.out);
	int n = Integer.parseInt(br.readLine());
	Cuadro ta[] = new Cuadro[4];
	for(int i = 0; i<4;i++){
	    char t[][] = new char[n][n];
	    for(int j = 0;j<n;j++){
		t[j] = br.readLine().toCharArray();
	    }
	    char iniB = '1';
	    char iniN = '0';
	    int emp = 1, auxB = 0, auxN = 0;
	    for(int j = 0; j<n;j++){
		for(int k = 0; k<n;k++){
		    if(t[j][k]==iniB){
			auxB++;
		    }
		    if(t[j][k]==iniN){
			auxN++;
		    }
		    iniB =iniB=='1'?'0':'1';
		    iniN =iniN=='1'?'0':'1';
		}
	    }
	    //System.out.println(auxB+" "+auxN);
	    ta[i] = new Cuadro(t,auxB,auxN);
	    if(i!=3){String linea = br.readLine();}
	}
	int ans = Integer.MAX_VALUE;
	int indice[] = {2,3,1,3,1,2,0,3,0,2,0,1};
	int c = 0;
	for(int i = 0; i<4;i++){
	    for(int j = i+1; j<4;j++){
		ans = Math.min(ta[i].malB+ta[j].malB+ta[indice[c]].malN+ta[indice[c+1]].malN,ans);
		c+=2;
	    }
	}
	out.println(ans);
	out.close();
    }
}

 	 	  	    		  			 	 				   		