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
/* package codechef; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class Codechef
{
    public class Obj implements Comparable<Obj>{
        public int start;
        public int end;
        
        public Obj(int start_, int end_){
            this.start = start_;
            this.end = end_;

        }
        
        public int compareTo(Obj other){
            if (other.start == this.start){
                return this.end - other.end;
            }
            return this.start - other.start;
        }

    }
    
	public static void main (String[] args) throws java.lang.Exception
	{
		// your code goes here
        Codechef cf = new Codechef();
        cf.Solve();
	}
	
	public void Solve(){
        MyScanner sc = new MyScanner();
        int n = sc.nextInt();
        int[][] boardWhite = new int[2 * n][2 * n];
        int[][] boardBlack = new int[2 * n][2 * n];
        for (int i = 0; i < 2*n; ++i){
            for (int j = 0; j < 2*n; ++j){
                if (i % 2 == 0){
                    if (j % 2 == 0){
                        boardWhite[i][j] = 0;
                    }else{
                        boardWhite[i][j] = 1;
                    }
                }else{
                    if (j % 2 == 0){
                        boardWhite[i][j] = 1;
                    }else{
                        boardWhite[i][j] = 0;
                    }
                }
                boardBlack[i][j] = 1 - boardWhite[i][j];
                // System.out.print(boardBlack[i][j] + " ");
            }
            // System.out.println();
        }
        
        int[][][] arr = new int[4][n][n];
        // System.out.println("n: " + n);
        for (int i = 0; i < 4; ++i){
            for (int k = 0; k < n; ++k){
                String s = sc.nextLine();
                // System.out.println("s: " + s);
                for (int  j = 0; j < n; ++j){
                    // System.out.println("j: " + j + " " + s.charAt(j));
                    if (s.charAt(j) == '1'){
                        arr[i][k][j] = 1;
                    }else{
                        arr[i][k][j] = 0;
                    }
                }    
            }
            sc.nextLine();
        }
        
        int[][] board = new int[2*n][2*n];
        int res = 4 * n * n + 1;
        for (int i1 = 0; i1 < 4; ++i1){
            for (int i2 = 0; i2 < 4; ++i2){
                if (i2 == i1) continue;
                for (int i3 = 0; i3 < 4; ++i3){
                    if (i3 == i2 || i3 == i1) continue;
                    for (int i4 = 0; i4 < 4; ++i4){
                        if (i4 == i1 || i4 == i2 || i4 == i3) continue;
                        makeBoard(arr, board, n, i1, i2, i3, i4);
                        int k = comp(n, board, boardWhite, boardBlack);
                        res = Math.min(res, k);
                    }
                }
            }
        }
        System.out.println(res);
	}
	
	public void makeBoard(int[][][] arr, int[][] board, int n, int i1, int i2, int i3, int i4){
	    for (int i = 0; i < n; ++i){
	        for (int j = 0; j < n; ++j){
	            board[i][j] = arr[i1][i][j];
	            board[i][j+n] = arr[i2][i][j];
	            board[i+n][j] = arr[i3][i][j];
	            board[i+n][j+n] = arr[i4][i][j];
	        }
	    }
	   // System.out.println("board: " + board);
	   // for (int i = 0; i < 2 * n; ++i){
	   //     for (int j = 0; j < 2 * n; ++j){
	   //         System.out.print(board[i][j] + " ");
	   //     }
	   //     System.out.println();
	   // }
	}
	
	public int comp(int n, int[][] board, int[][] boardWhite, int[][] boardBlack){
	    int dW = 0;
	    int dB = 0;
	    for (int i = 0; i < 2 * n; ++i){
	        for (int j = 0; j < 2 * n; ++j){
	            if (board[i][j] != boardWhite[i][j]){
	                dW++;
	            }
	            if (board[i][j] != boardBlack[i][j]){
	                dB++;
	            }
	        }
	    }
	    return Math.min(dW, dB);
	}

	//-----------PrintWriter for faster output---------------------------------
   public static PrintWriter out;
      
   //-----------MyScanner class for faster input----------
   public static class MyScanner {
      BufferedReader br;
      StringTokenizer st;
 
      public MyScanner() {
         br = new BufferedReader(new InputStreamReader(System.in));
      }
 
      String next() {
          while (st == null || !st.hasMoreElements()) {
              try {
                  st = new StringTokenizer(br.readLine());
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          return st.nextToken();
      }
 
      int nextInt() {
          return Integer.parseInt(next());
      }
 
      long nextLong() {
          return Long.parseLong(next());
      }
 
      double nextDouble() {
          return Double.parseDouble(next());
      }
 
      String nextLine(){
          String str = "";
      try {
         str = br.readLine();
      } catch (IOException e) {
         e.printStackTrace();
      }
      return str;
      }

   }
}
