/*
TASK:marriage
LANG:C
*/
#define MAXN 100
#include <stdio.h>

int n;
int i, j;

typedef struct
        {
         int used, grade[MAXN+5];
        } type;
type boys[MAXN+5], girls[MAXN+5];

void marriage ( int mi, int di )
             {
              if ( (mi>n) || (di>n) ) return;
              if ( boys[mi].used || girls[di].used ) return;

              int fl, mj, dj;
              for ( mj=mi+1; mj<=n; mj++ )
                  {
                   for ( dj=di+1; dj<=n; dj++ )
                       {
                        fl=0;
                        if ( ( boys[mi].grade[di] > boys[mi].grade[dj] ) || ( girls[dj].grade[mj] > girls[dj].grade[mi] ) ) fl++;
                        if ( ( boys[mj].grade[dj] > boys[mj].grade[di] ) || ( girls[di].grade[mi] > girls[di].grade[mj] ) ) fl++;
                        if ( fl != 2 ) break;
                       }
                   if ( dj <= n ) return;
                  }
              boys[mi].used=di;
              girls[di].used=mi;
             }
int main()
{

scanf ( "%d", &n );

for ( i=1; i<=n; i++ )
    for ( j=1; j<=n; j++ )
        scanf ( "%d", &boys[i].grade[j] );

for ( i=1; i<=n; i++ )
    for ( j=1; j<=n; j++ )
        scanf ( "%d", &girls[i].grade[j] );

for ( i=1; i<=n; i++ )
    for ( j=1; j<=n; j++ )
        {
         if ( boys[i].used ) break;
         marriage (i, j);
         if ( girls[j].used ) continue;
        }

for ( i=1; i<=n; i++ )
    printf ( "%d %d\n", i, boys[i].used );

return 0;
}

