/*
TASK: MARRIAGE
LANG: C++
*/
#include <iostream.h>
int m[101][101];    // masiv mom4eta
int d[101][101];    // masiv momi4eta
int co[2][100];     // masiv za gotovite dvoiki
int took[101]={0};  // masiv za zaetite momi
		    // 0 mom4eta   1 momi4eta
int n;              // broika
int k=0;            // broi gotovi dvoiki
int flag=0;         // flag za krai na programata

void put(int a, int b)    // postavqne na gotova dvoika
{
  co[0][k]=a;
  co[1][k]=b;
  took[b]=1;
  k++;
}

void pop()            // premahvane na poslednata dvoika
{
   k--;
   took[co[1][k]]=0;
   co[1][k]=0;
   co[0][k]=0;
}

int check(int a, int b)   // proverka dali dvoikata e ustoi4iva
{
   int p=0;               // spored kolko dvoiki vruzkata e ustoi4iva
   for(int j=0; j<k; j++)
   {
       if( ( (m[a][b] > m[a][co[1][j]]) || (d[co[1][j]][co[0][j]] > d[co[1][j]][a]) ) &&
	 ( (m[co[0][j]][co[1][j]] > m[co[0][j]][b]) || (d[b][a] > d[b][co[0][j]]) ) )
	   p++;
   }
   if(p==k) return 1;
   else return 0;
}

int marry(int i)          // rekursivna funkciq za vsi4ki kombinacii
{
   if(i>n){flag=1; return 0;}  // proverka za krai
   for(int j=1; j<=n; j++)
   {
     if(!took[j])              // proverka dali momata e zaeta
     {
       if(check(i, j))
       {
	  put(i, j);
	  marry(i+1);
	  if(flag) return 0;
	  pop();
       }
     }
   }
  return 0;
}
int main()
{
   cin  >> n;                         // vhod
   for(int i=1; i<=n; i++)
     for(int j=1; j<=n; j++)
       cin >> m[i][j];
   for(int h=1; h<=n; h++)
     for(int j=1; j<=n; j++)
	cin >> d[h][j];

   marry(1);                         // izvikvane

   if(flag)                          // izhod
     for(int s=0; s<n; s++)
       cout << co[0][s] << " " << co[1][s] << endl;
   else cout << 0 << endl;

   return 0;
}
