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.util.StringTokenizer;

public class CF_961_C_CHESS_BOARD {
	
	static Pair [] p;
	static int []curr = new int [2];
	static int min = Integer.MAX_VALUE;
	

	public static void main(String[] args) throws Exception {

		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();

		int[][] mat = new int[2 * n][2 * n];
		int[][] ideal1 = new int[n][n];
		int[][] ideal2 = new int[n][n];
		int v1 = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
				ideal1[i][j] = (v1 ^= 1);

		}

		v1 = 1;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++)
				ideal2[i][j] = (v1 ^= 1);

		}
		p  = new Pair[4];	
		for (int k = 0; k < 4; k++) {
			
			
			int ans1 = 0;
			int ans2 = 0;
			
			for (int i = 0; i < n; i++) {
				String s = sc.next();
				for (int j = 0; j < n; j++) {
					mat[i][j] = Integer.parseInt(s.charAt(j) + "");
					if(mat[i][j] !=ideal1[i][j])
						ans1++;
					if(mat[i][j] !=ideal2[i][j])
						ans2++;
					
				}
			}
			
			p[k] = new Pair(ans1, ans2);
		}
		
		curr = new int []{0,1,0,2,0,3,1,2,1,3,2,3};
		for(int i = 0 ; i<curr.length-1 ;i++)
		{
			int i1 = curr[i];
			int i2 = curr[i+1];
			int i3 = -1;
			int i4 = -1;
			for(int k = 0 ; k<4 ;k++)
				if(i1!=k && i2!=k) {
					i3 = k;
				break;
				}
			for(int k = 0 ; k<4; k++)
				if(i1!=k && i2!=k && i3!=k) {
					i4 = k;
					break;
				}
			
			min = Math.min(p[i1].p1+p[i2].p1+p[i3].p2+p[i4].p2, min);
			
		}
		
		System.out.println(min);

		
	}
	
	static class Pair{
		int p1 , p2;
		public Pair(int p1 , int p2 )
		{
			
			this.p1 = p1 ;
			this.p2 = p2 ;
			
		}
		
	}

	static 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();
		}

	}

}
