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.InputStreamReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;
import java.util.ArrayList;
public class Main {
	public static void main (String[] args) throws IOException {
	    Scanner sc = new Scanner(System.in);
	    
	    int n = sc.nextInt();
	    ArrayList<meh> grids = new ArrayList<>();
	    for(int c = 0; c < 4; c++){
	        sc.nextLine();
	        int numChangesEven = 0, numChangesOdd = 0;
	        for(int i = 0; i < n; i++){
	            String in = sc.nextLine();
	            for(int j = 0; j < n; j++){
	                int check = (int)(in.charAt(j) - '0');
	                if((i + j) % 2 == check){
	                    numChangesEven++;
	                }
	                else{
	                    numChangesOdd++;
	                }
	            }
	        }
	        
	        grids.add(new meh(numChangesEven, numChangesOdd));
	    }
	    
	    Collections.sort(grids, (a, b) -> {
	        return (int)Math.min(a.numChangesEven, a.numChangesOdd) - (int)Math.min(b.numChangesEven, b.numChangesOdd);
	    });
	    
	    int even = 2, odd = 2;
	    int out = 0;
	    for(int i = 0; i < 4; i++){
	        meh curr = grids.get(i);
	        if(even == 0){
	            out += curr.numChangesOdd;
	            odd--;
	        }
	        else if(odd == 0){
	            out += curr.numChangesEven;
	            even--;
	        }
	        else{
	            if(curr.wantsEven()){
	                out += curr.numChangesEven;
	                even--;
	            }
	            else{
	                out += curr.numChangesOdd;
	                odd--;
	            }
	        }
	    }
	    
	    System.out.println(out);
	}
}
class meh{
    int numChangesEven, numChangesOdd;
    meh(int numChangesEvenIn, int numChangesOddIn){
        numChangesEven = numChangesEvenIn;
        numChangesOdd = numChangesOddIn;
    }
    boolean wantsEven(){
        if(numChangesEven < numChangesOdd) return true;
        return false;
    }
}