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.Scanner;

public class Main {
	
	private static String[][] chess = new String[4][200];
	private static char[][] matrix = new char[500][500];
	private static int ans = - 1;
	
	public static void main(String[] args) throws Exception {
		
		Scanner scan = new Scanner(System.in);
		
		int i , j , n = scan.nextInt();
		for (i = 0;i < 4;i ++) {
			for (j = 0;j < n;j ++) {
				chess[i][j] = scan.next();
			}
		}
		dfs(0 , n);
		System.out.println(ans);
		
	}
	
	private static int getResult(int n) {
	
		int i , j , ans1 = 0 , ans2 = 0;
		for (i = 1;i <= 2 * n;i ++) {
			int value = 1;
			if (i % 2 == 1) {
				value = 1;
			} else {
				value = 0;
			}
			for (j = 1;j <= 2 * n;j ++) {
				int temp = matrix[i][j] - '0';
				if (temp != value) {
					ans1 ++;
				}
				value = 1 - value;
			}
		}
		
		for (i = 1;i <= 2 * n;i ++) {
			int value = 0;
			if (i % 2 == 1) {
				value = 0;
			} else {
				value = 1;
			}
			for (j = 1;j <= 2 * n;j ++) {
				int temp = matrix[i][j] - '0';
				if (temp != value) {
					ans2 ++;
				}
				value = 1 - value;
			}
		}
		return Math.min(ans1 , ans2);
		
	}
	
	private static boolean[] vis = new boolean[4];
	
	private static void dfs(int current , int n) {
		
		if (current == 4) {
			int temp = getResult(n);
			if (temp < ans || ans < 0) {
				ans = temp;
			}
		} else {
			for (int i = 0;i < 4;i ++) {
				if (!vis[i]) {
					vis[i] = true;
					// put chess[i] in current
					int x = 1 , y = 1;
					if (current == 0) {
						x = 1;
						y = 1;
					} else if (current == 1) {
						x = 1;
						y = n + 1;
					} else if (current == 2) {
						x = n + 1;
						y = 1;
					} else {
						x = n + 1;
						y = n + 1;
					}
					for (int dx = 0;dx < n;dx ++) {
						for (int dy = 0;dy < n;dy ++) {
							matrix[x + dx][y + dy] = chess[i][dx].charAt(dy);
						}
					}
					dfs(current + 1 , n);
					vis[i] = false;
				}
			}
		}
		
	}
	
    
}
















	

  