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.ArrayList;
import java.util.Scanner;
   
public class Codeforces {    
    public static void main(String[] args) {
        TaskC Solver = new TaskC();
        Solver.Solve();        
    }   
    private static class TaskC {
        private void Solve() {
            Scanner in = new Scanner(System.in);                                        
            int n = in.nextInt();
            Block blocks[] = new Block[4];            
            for (int i = 0; i < 4; i++) {
                blocks[i] = new Block(n, i);
                for (int j = 0; j < n; j++) {
                    String S = in.next();
                    for (int k = 0; k < n; k++) 
                        blocks[i].field[j][k] = S.charAt(k) - '0';                                       
                }                                                                
            }
            System.out.println(Compute(blocks, n));                                 
        }
        private static int Compute(Block blocks[], int n) {
            ArrayList <String> opt = new ArrayList();
            opt.add("1234");
            opt.add("1243");
            opt.add("1324");
            opt.add("1342");
            opt.add("1423");
            opt.add("1432");            
            opt.add("2134");
            opt.add("2143");
            opt.add("2314");
            opt.add("2341");
            opt.add("2413");
            opt.add("2431");            
            opt.add("3124");
            opt.add("3142");
            opt.add("3214");
            opt.add("3241");
            opt.add("3412");
            opt.add("3421");            
            opt.add("4123");
            opt.add("4132");
            opt.add("4213");
            opt.add("4231");
            opt.add("4312");            
            opt.add("4321");           
            int min = 1000000000;
            for (int i = 0; i < 24; i++) {
                Block bl[] = new Block[4];
                for (int j = 0; j < 4; j++)
                    bl[j] = blocks[opt.get(i).charAt(j) - '1'];                                
                int result = Treatment(bl, n);
                min = Math.min(min, result);
            }            
            return min;
        }
        private static int Treatment(Block bl[], int n) {
            int size = 2 * n;
            int ar[][] = new int [size][size];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    ar[i][j] = bl[0].field[i][j];            
            for (int i = 0; i < n; i++)
                for (int j = n; j < size; j++)
                    ar[i][j] = bl[1].field[i][j - n];            
            for (int i = n; i < size; i++)
                for (int j = 0; j < n; j++)
                    ar[i][j] = bl[2].field[i - n][j];            
            for (int i = n; i < size; i++)
                for (int j = n; j < size; j++)
                    ar[i][j] = bl[3].field[i - n][j - n];            
            int curColor1, curColor2, ans1 = 0, ans2 = 0;
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++) {
                    if ((i + j) % 2 == 0) {
                        curColor1 = 1;
                        curColor2 = 0;
                    }
                    else {
                        curColor1 = 0;
                        curColor2 = 1;
                    }
                    if (ar[i][j] != curColor1)
                        ans1++;                    
                    if (ar[i][j] != curColor2)
                        ans2++;
                }           
            return Math.min(ans1, ans2);
        }
        private static class Block {            
            private int field[][], size;
            private int num;            
            public Block(int size, int num) {
                this.size = size;
                this.num = num;
                field = new int [size][size];
            }
        }
    }
}