program sandaugos_istrizainese;

   const MAX = 10; { maksimalus lentel‚s dydis }
         PRAD = 'SAND.DAT';
         REZ = 'SAND.REZ';
   type kvadrat = array [1..MAX, 1..MAX] of longint;

   { ‘emiau apra˛yti globalieji kintamieji, kuri— reik˛m‚s }
   { proced–rose nekei‡iamos }
   var n: longint; { duotojo kvadrato dydis }
       k: kvadrat; { duotasis kvadratas }

   function lygios (prad_e, prad_s, dydis: longint): boolean;
   { tikrina, ar kvadrato, kurio kra˛tin‚ lygi kint 'dydis' reik˛mei }
   { ir kurio kairiojo vir˛utiniojo langelio koordinat‚s yra (prad_e, prad_s) }
   { ¨stri‘ain‚se esan‡i— skai‡i— sandaugos lygios }
     var san_k, san_d, i: longint;
   begin
     { skai‡i— sandauga ¨stri‘ain‚se }
     san_k := 1; { i˛ kair‚s ¨ de˛in¨j¨ apatin¨ kamp… }
     san_d := 1; { i˛ de˛in‚s ¨ kair¨j¨ apatin¨ kamp… }
     for i := 1 to dydis do
       begin
         san_k := san_k * k[prad_e+i-1,  prad_s+i-1];
         san_d := san_d * k[prad_e+i-1, prad_s+(dydis-i+1)-1]
       end;
     lygios := san_k = san_d;
   end; { lygios }

   procedure ieskoti ({ globalieji - n, k }
                      var dydis: longint;
                      var rast_kv: kvadrat { rastasis kvadratas });
   { duotame kvadrate ie˛ko ma‘iausio kvadrato, kurio ¨stri‘aini— }
   { sandaugos b–t— lygios }
     var rasta: boolean;
         paskutinis, i, j, prad_e, prad_s: longint;
   begin
     rasta := false; { ie˛komo kvadrato dar nerasta }
     dydis := n; { prad‚sime nuo did‘iausio kvadrato }
     repeat
       prad_e := 1;   { ie˛komo kvadrato vir˛utinis kairysis kampas }
       prad_s := 0;
       paskutinis := n - dydis + 1;
       repeat
         { imame kit… kvadrat… }
         if prad_s = paskutinis
            then begin prad_s := 1;
                       prad_e := prad_e + 1
                  end
            else prad_s := prad_s + 1;
         { tikriname, ar turimas kvadratas yra sprendinys }
         rasta := lygios (prad_e, prad_s, dydis);
       until rasta or ((prad_e = paskutinis) and (prad_s = paskutinis));
         dydis := dydis - 1;
     until rasta; { vienetinis kvadratas tiks visada, taigi visada rasime }
                  { rezultat… }
     { suformuojame rezultat… }
     dydis := dydis + 1;
     for i := 1 to dydis do
      for j := 1 to dydis do
        rast_kv[i, j] := k[prad_e + (i-1), prad_s + (j-1)];
   end; { ie˛koti }

   var f: text;
       dydis, i, j: longint;
       rast_kv: kvadrat;
begin
  { duomen— skaitymas }
  assign (f, PRAD);
  reset (f);
  readln (f, n);
  for i := 1 to n do
    for j := 1 to n do
      read (f, k[i, j]);
  close (f);

  { kvadrato paie˛ka }
  ieskoti (dydis, rast_kv);

  { rezultat— ra˛ymas }
  assign (f, REZ);
  rewrite (f);
  if dydis = n
     then writeln (f, 'SANDAUGOS LYGIOS')
     else for i := 1 to dydis do
            begin
              for j := 1 to dydis do
                write (f, rast_kv[i, j], ' ');
              writeln (f);
            end;
  close (f);
end.