import java.util.*;
import java.util.StringTokenizer; 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.PrintStream;
import java.io.Console;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

public class _sol{
    static String sFileName ="sorting";

    public static void main(String[] args) {
        _sol s = new _sol();
        s.solve();
    }
    public void solve(){ 
    long startTime = System.currentTimeMillis()+2500;
        ReadFileData readFileData=new ReadFileData();
        int min = Integer.MAX_VALUE;
        List<String> s=null;
        try {
            FileData fileData=readFileData.ReadFile(sFileName);
            sortArray sa = new sortArray(fileData);
            for (int i=1;i<5;i++){
                sa.sortIt(i);
                if (min>sa.mincost){
                    min = sa.mincost;
                    s= sa.printSwaps();
                }
                if (System.currentTimeMillis()<startTime){
                    break;
                }
            }
            writeFile(s);
        }
        catch(IOException e){

        }
        System.exit(0);
    }

    private static void writeFile(List<String> sOut) throws IOException {
        String name = sFileName + ".out";
        /*
		File logFile=new File(name);

	    BufferedWriter writer = new BufferedWriter(new FileWriter(logFile));
	    writer.write (sOut);
	    //Close writer
        writer.close();
*/
        PrintStream pr = null;
        try {
            pr = new PrintStream(name);
            for(String a : sOut){ 
                pr.println(a);
            }

        } catch (Exception e) {
            
        }
        
        
	}

    
    
}
class ReadFileData{
    public FileData ReadFile(String sFileName) throws IOException{ 
        String name = sFileName + ".in";
        FileData fileData;//new FileData();
        BufferedReader br = new BufferedReader(new FileReader(name));
        try {
                String line = br.readLine();
                int N=Integer.parseInt(line);
                line = br.readLine();
                fileData = new FileData(N,line);//  FillArray(N,line);

                line = br.readLine();
                fileData.tP=Integer.parseInt(line);
                for(int i=0;i<N;i++){
                    line = br.readLine();
                    fileData.FillPozCost(i, line);
                }
                line = br.readLine();
                fileData.tV=Integer.parseInt(line);
                for(int i=0;i<N;i++){
                    line = br.readLine();
                    fileData.FillValCost(i, line);
                }
        } 
        finally {
            br.close();
        }  
        return  fileData;     
    }
}
class FileData{
    int N;
    int tP;
    int tV;
    int[] array1;
    int[][] pozCost;
    int[][] valCost;
    public FileData(int N,String line){
        this.N=N;
        FillArray(line);
    }
    private void FillArray(String line){
        array1 = new int[N];
        pozCost = new int[N][N];
        valCost = new int[N][N];
        StringTokenizer st = new StringTokenizer(line); 
        for(int i=0; i<N; i++){
            array1[i]= Integer.parseInt(st.nextToken());
        }
    }
    public void FillPozCost(int i, String line){
        StringTokenizer st = new StringTokenizer(line); 
        for(int j=0; j<N; j++){
            pozCost[i][j]= Integer.parseInt(st.nextToken());
        }
    }
    public void FillValCost(int i, String line){
        StringTokenizer st = new StringTokenizer(line); 
        for(int j=0; j<N; j++){
            valCost[i][j]= Integer.parseInt(st.nextToken());
        }
    }
    public int SwapCost(int pi, int pj,int vi, int vj){
        //System.out.println("pI= " + pi + " pJ= " + pj + " vI= " + vi + " vJ= " + vj );
        //System.out.println (" pozCost = " + pozCost[pi][pj] + " valCost = " + valCost[vi-1][vj-1]);
        return pozCost[pi][pj]+valCost[vi-1][vj-1];
    }
}

class sortArray{
    FileData fileData;
    List<Swaps> swaps = new ArrayList<Swaps>();
    int mincost;
    String output;
    public sortArray(FileData fileData){
        this.fileData=fileData;
    }
    public void sortIt(int metod){
        switch (metod){
            case 1:
                sortMetod1();
                break;
            case 2:
                sortMetod2();
                break;
            case 3:
                sortMetodBuble();
                break;
            case 4:
                sortMetodBuble1();
                break;
        }
    }

    public List<Swaps>  sortMetod1(){
        swaps = new ArrayList<Swaps>();
        int cost1=0;
        int[] ar = Arrays.copyOf(this.fileData.array1, this.fileData.array1.length);
        for(int j=0; j<ar.length; j++){
            while(ar[j]!=j+1){
                cost1 += swap1(ar,j);
            }
        }
        mincost=cost1;
        return swaps;
    }
    public List<Swaps>  sortMetod2(){
        swaps = new ArrayList<Swaps>();
        int cost1=0;
        int[] ar = Arrays.copyOf(this.fileData.array1, this.fileData.array1.length);
        for(int j=ar.length-1; j>-1; j--){
            while(ar[j]!=j+1){
                cost1 += swap1(ar,j);
            }
        }
        mincost=cost1;
        return swaps;
    }
    public List<Swaps>  sortMetodBuble(){
        swaps = new ArrayList<Swaps>();
        int cost1=0;
        int[] ar = Arrays.copyOf(this.fileData.array1, this.fileData.array1.length);
        for(int i=0; i<ar.length-1; i++){
            if(ar[i]!=i+1){ 
                for(int j=i+1; j<ar.length; j++){
                    if (ar[j]==i+1){
                        cost1 += swap(ar,i,j);
                    }
                }
            }   
        }
        mincost=cost1;
        return swaps;
    }
    public List<Swaps>  sortMetodBuble1(){
        swaps = new ArrayList<Swaps>();
        int cost1=0;
        int[] ar = Arrays.copyOf(this.fileData.array1, this.fileData.array1.length);
        for(int i=ar.length-1; i>0; i--){
            if(ar[i]!=i+1){ 
                for(int j=i-1; j>-1; j--){
                    if (ar[j]==i+1){
                        cost1 += swap(ar,i,j);
                    }
                }
            }   
        }
        mincost=cost1;
        return swaps;
    }
    
    private int swap1(int[] ar, int j){
        int i = ar[j]-1;
        return swap(ar,i,j);
    }
    private int swap(int[] ar, int i, int j){
        int t = ar[j];
        ar[j] = ar[i];    
        ar[i] = t;
        
        int cost = this.fileData.SwapCost( i, j, ar[j], ar[i]);
        Swaps s = new Swaps(j+1, i+1, cost);
        swaps.add(s);
        return cost;
    }
    public List<String> printSwaps(){
       List<String> sb = new ArrayList<String>();
       sb.add(Integer.toString(swaps.size()) );
        for (Swaps s : swaps) {
            sb.add(s.toString());
        }
        return sb;
    }
}

 class Swaps{
        int i;
        int j;
        int cost;
        //
    public Swaps(int i, int j, int c){
        this.i=i; this.j=j;this.cost=c;
    } 
    public String toString(){
        return i + " " + j ;
    }
}