/*
TASK:marriage
LANG:C++
*/
# include <stdio.h>
# include <stdlib.h>
# define MAXN (1<<7)

int n;
int datab[MAXN][MAXN],datag[MAXN][MAXN];
int boy[MAXN][MAXN];
int used[MAXN];
int ans[MAXN];

void print() {
     for(int i = 1; i <=n; i++) {
          printf("%d %d\n",i, ans[i]);
     }
     exit(0);
}

void read() {
     scanf("%d", &n);
     for(int i = 1; i <= n; i++) {
          for(int j = 1; j <= n; j++) {
               scanf("%d", &datab[i][j]);
               boy[i][n-datab[i][j]+1] = j;
          }
     }
     for(int i = 1; i <= n; i++) {
          for(int j = 1; j <= n; j++) {
               scanf("%d", &datag[i][j]);
               //girl[i][n-datag[i][j]+1] = j;
          }
     }
}

void solve(int p) {
     if(p > n) print();
     int ok = 1;
     int g;
     for(int i = 1; i <= n; i++) {
          if(used[boy[p][i]]== 0) {
               g = boy[p][i];
               for(int k = p-1; k > 0; k--) {
                      if(!((datab[p][g] > datab[p][ans[k]] || datag[ans[k]][k] > datag[ans[k]][p]) && (datab[k][ans[k]] > datab[k][g] || datag[g][p] > datag[g][k]))) {
                          ok = -1;
                          break;
                      }
               }
               if(ok == 1) {
                    used[g] = 1;
                    ans[p] = g;
                    solve(p+1);
               }

          }
          
     }
    if(p <= n) return;
}

int main() {
    read();
    solve(1);
    printf("0\n");
return 0;
}
