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.*;
import java.util.*;
import java.lang.Math;

public class Ankit{
    
    Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)), false);
    
    long mod = (long) (1e9 + 7), inf = (long) (3e18);
    ArrayList<ArrayList<Integer> > allPerm = new ArrayList<ArrayList<Integer> >(24);
    void permute(java.util.List<Integer> arr, int k){
        for(int i = k; i < arr.size(); i++){
            java.util.Collections.swap(arr, i, k);
            permute(arr, k+1);
            java.util.Collections.swap(arr, k, i);
        }
        if (k == arr.size() -1){
            ArrayList<Integer> temp= new ArrayList<Integer>();
            for(int i=0;i<arr.size();i++){
                temp.add(arr.get(i));
            }
            allPerm.add(temp);
        }
    }

        
    void solve() {
        permute(java.util.Arrays.asList(0,1,2,3), 0);
        int n=in.nextInt();
        int [][][] parts =new int [n][n][4];
        for(int k=0;k<4;k++){
            for(int i=0;i<n;i++){
                String tmp=in.next();
                for(int j=0;j<n;j++){
                    parts[i][j][k]=(tmp.charAt(j)=='0'?0:1);            
                }        
            }
        } 
        int res=(int)2e9;
         
        for(int k=0;k<allPerm.size();k++){
            int[] a=new int[4];
            for(int j=0;j<allPerm.get(k).size();j++){
                a[j]=allPerm.get(k).get(j);         
            }
            int[][] finalarray=new int [2*n][2*n];
            for(int i=0;i<2*n;i++){
                for(int j=0;j<2*n;j++){
                    if(i<n && j<n){
                        finalarray[i][j]=parts[i][j][a[0]];
                    }
                    if(i<n && j>=n){
                        finalarray[i][j]=parts[i][j-n][a[1]];
                    }
                    if(i>=n && j<n){
                        finalarray[i][j]=parts[i-n][j][a[2]];
                    }
                    if(i>=n && j>=n){
                        finalarray[i][j]=parts[i-n][j-n][a[3]];
                    }
                }
            }
            int cnt1=0;
            int cnt2=0;
            for(int i=0;i<2*n;i++){
                for(int j=0;j<2*n;j++){
                    cnt1+=((finalarray[i][j]==((i+j)%2))?1:0);
                    cnt2+=(((finalarray[i][j])!=((i+j)%2))?1:0);           
                }
            }
            res=Math.min(res,cnt1);
            res=Math.min(res,cnt2);

           
        }
        out.println(res);
    }
    
 
    
    // -------- I/O Template -------------
    void run() {
        solve();
        out.flush();
    }
   
    public static void main(String[] args) {
        new Ankit().run();
    }
}