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
//Educational Codeforces Round 41
import java.io.*;
import java.util.*;

public class TaskC {

    public static void main (String[] args) throws IOException {
        FastScanner fs = new FastScanner(System.in);
        PrintWriter pw = new PrintWriter(new BufferedOutputStream(System.out));

        int n = fs.nextInt();
        boolean[][][] a = new boolean[4][n][n]; 
        boolean[][] b = new boolean[n+n][n+n]; 

        for (int k = 0; k < 4; k++) {
            for (int i = 0; i < n; i++) {
                String s = fs.next();
                for (int j = 0; j < n; j++) {
                    a[k][i][j] = s.charAt(j) == '1';
                }
            }
        }

        int[][] x = 
{ {1, 2, 3, 4}
, {1, 2, 4, 3}
, {1, 3, 2, 4}
, {1, 3, 4, 2}
, {1, 4, 2, 3}
, {1, 4, 3, 2}
, {2, 1, 3, 4}
, {2, 1, 4, 3}
, {2, 3, 1, 4}
, {2, 3, 4, 1}
, {2, 4, 1, 3}
, {2, 4, 3, 1}
, {3, 1, 2, 4}
, {3, 1, 4, 2}
, {3, 2, 1, 4}
, {3, 2, 4, 1}
, {3, 4, 1, 2}
, {3, 4, 2, 1}
, {4, 1, 2, 3}
, {4, 1, 3, 2}
, {4, 2, 1, 3}
, {4, 2, 3, 1}
, {4, 3, 1, 2}
, {4, 3, 2, 1}
};

        int m = (n+n)*(n+n);

        for (int q = 0; q < 24; q++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    b[i  ][j  ] = a[x[q][0]-1][i][j];
                    b[i+n][j  ] = a[x[q][1]-1][i][j];
                    b[i  ][j+n] = a[x[q][2]-1][i][j];
                    b[i+n][j+n] = a[x[q][3]-1][i][j];
                }
            }
            int c = 0;
            for (int i = 0; i < n+n; i++) {
                for (int j = 0; j < n+n; j++) {
                    if (b[i][j] == (((i+j)&1) == 0)) {
                        c++;
                    }
                }
            }
            if (c < m) m = c;
            c = 0;
            for (int i = 0; i < n+n; i++) {
                for (int j = 0; j < n+n; j++) {
                    if (b[i][j] != (((i+j)&1) == 0)) {
                        c++;
                    }
                }
            }            
            if (c < m) m = c;
        }
        
        pw.println(m);

        pw.close();
    }

    static class FastScanner {
        BufferedReader reader;
        StringTokenizer tokenizer;
        FastScanner(InputStream i) {
            reader = new BufferedReader(new InputStreamReader(i));
            tokenizer = new StringTokenizer("");
        }
        String next() throws IOException {
            while(!tokenizer.hasMoreTokens()) tokenizer = new StringTokenizer(reader.readLine());
            return tokenizer.nextToken();
        }
        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }
        long nextLong() throws IOException {
            return Long.parseLong(next());
        }
    }
}