/*
TASK:marriage
LANG:C++
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int N;
char A[100][100], B[100][100];
bool C[100][100];
int Y[100];
bool used[100];
int chconf(int i, int j)
{
  for(int k=0; k<i; k++)
  {
   if(((A[i][Y[k]]>=A[i][j])&&(B[j][k]>=B[j][i]))||((A[k][j]>=A[k][Y[k]])&&(B[Y[k]][i]>=B[Y[k]][k])))
   //if(A[i][j]!=N&&B[j][i]!=N)
   {
    return 1;
   }
  }
  return 0;
}
int print()
{
 for(int as=0; as<N; as++)
 {
  for(int df=0; df<N; df++)
  {
   if(as==df) continue;
   if((A[as][Y[as]]<=A[as][Y[df]])&&(B[Y[as]][as]<=B[Y[as]][df]))
   {
    //cout<<"ex";
    return 0;
   }
  }
 }
 for(int i=0; i<N; i++)
 {
  printf("%i %i\n", i+1, Y[i]+1);
 }
 //printf("\n\n%i", chconf(1,1));
 exit(0);
 return 0;
}
int backtrack(int k)
{
 if(k==N)
 {
  print();
  //exit(0);
 }
 for(int i=0; i<N; i++)
 {
  if(!used[i]&&!chconf(k,i))
  {
   used[i]=1;
   C[k][i]=1;
   Y[k]=i;
   backtrack(k+1);
   Y[k]=0;
   C[k][i]=0;
   used[i]=0;
  }
 }
 return 0;
}
int main()
{
 cin>>N;
 for(int i=0; i<N; i++)
 {
    for(int j=0; j<N; j++)
    {
     cin>>A[i][j];
    }
 }
 for(int k=0; k<N; k++)
 {
  for(int l=0; l<N; l++)
  {
   cin>>B[k][l];
  }
 }
 backtrack(0);
 printf("0");
 return 0;
}
 
 
