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.*;
public class probC{
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		Permutation p =new Permutation();
		p.permute("0123",0,3);
		int[][][] pieces =new int[4][n][n];
		for(int k=0;k<4;k++){
			for (int i=0;i<n ;i++ ) {
				String str=scan.next();
				for (int j=0;j<n ;j++ ) {
					pieces[k][i][j]=str.charAt(j)-'0';
				}	
			}
		}
		int min=1000000;
		for (int i=0; i<24; i++) {
			
			// System.out.println("------------------------"+i+"---------------------------");
			// System.out.println(p.arr[i]);
			int temp=functionmain(p.arr[i],n,pieces);

			min =min<temp ? min:temp;
			// System.out.println(min);
		}
		System.out.println(min);
	}
	static int functionmain(String a,int n,int[][][] pieces){
		int[][] newarr=new int[2*n+1][2*n+1];
		for (int i=0;i<=2*n;i++ ) {
			newarr[0][i]=-1;
			newarr[i][0]=-1;
		}
		function(newarr,1,n,1,n,pieces[Integer.parseInt(a.charAt(0)+"")]);
		function(newarr,1,n,n+1,2*n,pieces[Integer.parseInt(a.charAt(1)+"")]);
		function(newarr,n+1,2*n,1,n,pieces[Integer.parseInt(a.charAt(2)+"")]);
		function(newarr,n+1,2*n,n+1,2*n,pieces[Integer.parseInt(a.charAt(3)+"")]);
		// for (int i=0;i<=2*n ;i++ ) {
		// 	for (int j=0; j<=2*n; j++) {
		// 		System.out.print(newarr[i][j]);
		// 	}
		// 	System.out.println();
		// }
		int[][] newarr2=new int[2*n+1][2*n+1];
		for (int i=0; i<=2*n;i++) {
			for (int j=0; j<=2*n;j++ ) {
				newarr2[i][j]=newarr[i][j];
			}
		}
		int max=0;
		for (int i=1;i<=2*n ;i++ ) {
			if(Math.abs(newarr[i][1]-newarr[i-1][1])==0){
				max++;
				newarr[i][1]=1-newarr[i][1];
			}
			for (int j=2;j<=2*n ;j++ ) {
				if(Math.abs(newarr[i][j]-newarr[i][j-1])==0){
				max++;
				newarr[i][j]=1-newarr[i][j];
				}
			}
		}
		int max2=1;
		newarr2[1][1]=1-newarr2[1][1];
		for (int i=1;i<=2*n ;i++ ) {
			if(Math.abs(newarr2[i][1]-newarr2[i-1][1])==0){
				max2++;
				newarr2[i][1]=1-newarr2[i][1];
			}
			for (int j=2;j<=2*n ;j++ ) {
				if(Math.abs(newarr2[i][j]-newarr2[i][j-1])==0){
				max2++;
				newarr2[i][j]=1-newarr2[i][j];
				}
			}
		}
		return max<max2 ? max:max2;
	}
	static void function(int[][] newarr,int rowup,int rowdown,int leftcolumn,int rightcolumn, int[][] piece){
		
		for (int i=rowup;i<=rowdown ;i++ ) {
			for(int j=leftcolumn;j<=rightcolumn;j++){
				newarr[i][j]=piece[i-rowup][j-leftcolumn];
				// if(piece[i-rowup][j-leftcolumn]==1){
				// 	System.out.println("GFDSGFDsgsfdghsfdhsd");
				// }
			}
		}

	}
}
	
class Permutation{   
	int i=0;
     String arr[] =new String[24];
	 void permute(String str, int l, int r)
	{
		if (l == r){
			arr[i++]=str;
		    
		}
		else
		{
			for (int i = l; i <= r; i++)
			{
				str = swap(str,l,i);
				permute(str, l+1, r);
				str = swap(str,l,i);
			}
		}
	}

	public String swap(String a, int i, int j)
	{
		char temp;
		char[] charArray = a.toCharArray();
		temp = charArray[i] ;
		charArray[i] = charArray[j];
		charArray[j] = temp;
		return String.valueOf(charArray);
	}

}