{
TASK: marriage
LANG: PASCAL
}
program Marriage;
const MaxN=100;
var N:integer;
    MD: array[1..MaxN,1..MaxN] of integer; (* ocenki na mladezi za devojki *)
    DM: array[1..MaxN,1..MaxN] of integer; (* ocenki na devojki za mladezi *)
    Pairs: array[1..MaxN,1..2] of integer; (* brakosachetani dvojki *)
    NPairs:integer;                        (* broj na brakosachetanite dvojki*)
    SM:array[1..MaxN] of integer;          (* spisak ot ergeni *)
    UkSM:integer;                          (* ukazatel na spisaka ot ergeni*)
    DS:array[1..MaxN] of integer;          (* nomera na sapruzeskata dvojka na *)
                                           (* devojkite - ako e 0 devojkata*)
                                           (* ne e omazena *)
    i,j,k,a,b:integer;
    function MDmax(m:integer):integer;
    (* Za mladez s nomer m namira nomera na naj-predpochitanata*)
    (* ot nego devojka *)
    var p,l,r:integer;
    begin
      p:=MD[m,1];l:=1;
      for r:=2 to N do
        if MD[m,r]>p then
          begin
            p:=MD[m,r]; l:=r;
          end;
      MDmax:=l;
    end;
begin
  readln(N);
  for i:=1 to N do
    begin
      for j:=1 to N-1 do
        read(MD[i,j]);
      readln(MD[i,N])
    end;
  for i:=1 to N do
    begin
      for j:=1 to N-1 do
        read(DM[i,j]);
      readln(DM[i,N])
    end;
  (* Popalvane na spisaka s ergeni *)
  for i:=1 to N do
    SM[i]:=i;
  (* Parvonachalno vsichki devojki sa neomazeni *)
  for i:=1 to N do
    DS[i]:=0;
  (* Obrazuvane na parva dvojka - mladez 1 s naj-haresvanata ot nego devojka*)
   Pairs[1,1]:=1; Pairs[1,2]:=MDmax(1);
   NPairs:=1;
   UkSM:=2;DS[Pairs[1,2]]:=1;
   while (NPairs<N) do
     begin
       k:=MDMax(SM[UkSM]);      (*namira naj-predpochitanata ot mladez s nomer *)
                                (* SM[UkSM] devojka *)
       if ( DS[k]=0) then       (* Ako tia ne e omazena, to se obrazuva *)
         begin                  (* nova dvojka *)
           NPairs:=NPairs+1;
           Pairs[NPairs,1]:=SM[UkSM];
           Pairs[NPairs,2]:=k;
           DS[k]:=NPairs;
           UkSM:=UkSM+1;
         end
       else                     (* Ako e omazena, to gledame kogo haresva *)
                                (* poveche - staria si saprug ili novia *)
                                (* kandidat;ako e staria saprug, to v *)
                                (* ocenkata na kandidata za devojkata *)
                                (* slagame 0 i prodalzavame da mu tarsim *)
                                (* zena v spisaka veche bez tazi devojka *)
                                (*, a ako e novia kandidat *)
                                (* to promeniame starata dvojka kato *)
                                (* davame kandidata za saprug na devojkata*)
                                (* a v ocenkata na staria i saprug za neia *)
                                (* slagame 0 i go vpisvame na miastoto na*)
                                (* kandidata *)
         begin
           a:=SM[UkSM];
           b:=Pairs[DS[k],1];
           if DM[k,b]>DM[k,a] then
             MD[a,k]:=0
           else
             begin
               Pairs[DS[k],1]:=a;
               MD[b,k]:=0;
              SM[UkSM]:=b
             end
         end
     end;
   for i:=1 to N do
     writeln(Pairs[i,1],' ',Pairs[i,2]);
end.