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

public class zizo {
	
	static char[][]a1;
	static char[][]a2;
	static char[][]a3;
	
	static char[][]a4;
	static int n;
	static int c1;
	static int c2;
	static void com0(char[][]arr) 
	{	
		int x=0;
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<n;j++) {
				if(x++%2==0) {
					if(arr[i][j]=='1') {
						c1++;
					}else c2++;
				}else {
					if(arr[i][j]=='1')c2++;
					else c1++;
				}
			}
		}		
	}
	
	
	
	public static void main(String[]args) throws IOException {

		Scanner sc=new Scanner(System.in);
		PrintWriter wr=new PrintWriter(System.out);
		
		n=sc.nextInt();
		a1=new char[n][n];
		a2=new char[n][n];
		a3=new char[n][n];
		a4=new char[n][n];
		for(int i=0;i<4;i++) {
			for(int j=0;j<n;j++) {
				
				if(i==0) {
					a1[j]=sc.nextLine().toCharArray();
				}else if(i==1) {
					a2[j]=sc.nextLine().toCharArray();
				//	System.out.println(Arrays.toString(a2[j]));
				}else if(i==2) {
					a3[j]=sc.nextLine().toCharArray();
				}else {
					a4[j]=sc.nextLine().toCharArray();
				}
				
			}
			sc.nextLine();
		}
		int[]arr0=new int[4];
		int[]arr1=new int[4];
		for(int i=0;i<4;i++) {
			c1=0;c2=0;
			if(i==0) {
				com0(a1);
				
			}else if(i==1) {
				com0(a2);
			}else if(i==2) {
				com0(a3);
			}else {
				com0(a4);
			}
			arr0[i]=c1;
			arr1[i]=c2;
		}
	//0	System.out.println(Arrays.toString(arr0));
	//System.out.println(Arrays.toString(arr1));
		int r=Integer.MAX_VALUE;
		for(int i=0;i<4;i++) {
			for(int j=0;j<4;j++) {
				for(int k=0;k<4;k++) {
					if(k==i)continue;
					for(int s=0;j<4&&s!=j;s++) {
						if(j==s)continue;
						r=Math.min(r,arr0[i]+arr0[k]+arr1[j]+arr1[s]);
						if(i==0&&j==1&&k==3&&s==2)System.out.println(r);
					}
				}
			}
		}
		wr.println(r);
		wr.flush();wr.close();


	}
	
}

class Scanner 
{
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

	public String next() throws IOException 
	{
		while (st == null || !st.hasMoreTokens()) 
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public int nextInt() throws IOException {return Integer.parseInt(next());}

	public long nextLong() throws IOException {return Long.parseLong(next());}

	public String nextLine() throws IOException {return br.readLine();}

	public double nextDouble() throws IOException
	{
		String x = next();
		StringBuilder sb = new StringBuilder("0");
		double res = 0, f = 1;
		boolean dec = false, neg = false;
		int start = 0;
		if(x.charAt(0) == '-')
		{
			neg = true;
			start++;
		}
		for(int i = start; i < x.length(); i++)
			if(x.charAt(i) == '.')
			{
				res = Long.parseLong(sb.toString());
				sb = new StringBuilder("0");
				dec = true;
			}
			else
			{
				sb.append(x.charAt(i));
				if(dec)
					f *= 10;
			}
		res += Long.parseLong(sb.toString()) / f;
		return res * (neg?-1:1);
	}

	public boolean ready() throws IOException {return br.ready();}


}