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.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class T3 {
	

    
	public static void main(String[] args) {
		MyScanner sc = new MyScanner();
		int n = sc.nextInt();  
		
		int[][][] a = new int[4][n][n];
		
		int w1[] = new int[4];
		int w2[] = new int[4];
		
		for (int k = 0; k < 4; k++) {
			if (k > 0) sc.nextLine();
			
			for (int i = 0; i < n; i++) {
				String s = sc.nextLine();
				s = s.trim();
				//System.out.println(i + "!!" + s);
				
				for (int j = 0; j < n; j++) {
					a[k][i][j] = s.charAt(j) - '0';
					//System.out.println(k + " " + i  +" " + j + " " + a[k][i][j]);
					if (((i+j) % 2 == 0) && a[k][i][j] == 0) {
						w1[k]++;  
					}
					if (((i+j) % 2 == 1) && a[k][i][j] == 1) {
						w1[k]++;  
					}
					if (((i+j) % 2 == 0) && a[k][i][j] == 1) {
						w2[k]++;  
					}
					if (((i+j) % 2 == 1) && a[k][i][j] == 0) {
						w2[k]++;  
					}
					
				}
			}
		}
		
		int min = 10000000;
		for (int i1 = 0; i1 < 4; i1++) {
			for (int i2 = 0; i2 < 4; i2++) {
				for (int i3 = 0; i3 < 4; i3++) {
					for (int i4 = 0; i4 < 4; i4++) {
						if (i1 != i2 && i1 != i3 && i1 != i4 && i2 != i3 && i2!=i4 && i3!= i4) {
							if (w1[i1] + w1[i2] + w2[i3] + w2[i4] < min) {
								min = w1[i1] + w1[i2] + w2[i3] + w2[i4];
							}
						}
					}	
				}	
			}
		}
		System.out.println(min);
	}
	
	 public static class MyScanner {
	      BufferedReader br;
	      StringTokenizer st;
	 
	      public MyScanner() {
	         br = new BufferedReader(new InputStreamReader(System.in));
	      }
	 
	      String next() {
	          while (st == null || !st.hasMoreElements()) {
	              try {
	                  st = new StringTokenizer(br.readLine());
	              } catch (IOException e) {
	                  e.printStackTrace();
	              }
	          }
	          return st.nextToken();
	      }
	 
	      int nextInt() {
	          return Integer.parseInt(next());
	      }
	 
	      long nextLong() {
	          return Long.parseLong(next());
	      }
	 
	      double nextDouble() {
	          return Double.parseDouble(next());
	      }
	 
	      String nextLine(){
	          String str = "";
		  try {
		     str = br.readLine();
		  } catch (IOException e) {
		     e.printStackTrace();
		  }
		  return str;
	      }

	   }
}
