{
TASK:KVADRATAS
LANG:PASCAL
}
program antimagiskas_kvadratas;
  { 291 uždavinys, 15 olimpiada, II etapas, Vyresniųjų grupė }  
  
  const PRAD = 'kvadr.dat';
        MAX = 9; { maksimalus kvadrato dydis }
  type kvadratas = array [1..MAX, 1..MAX] of integer;
       lentele = array [1..MAX*2+2] of integer;
       aibe = set of 1..MAX*MAX;

  { žemiau aprašyti globalieji kintamieji }
  var n: integer;
      k: kvadratas;

  procedure sumos (var e, s: lentele; var ist1, ist2: integer;
                   var visi: boolean);
   { apskaičiuojamos reikalingos sumos, patikrinama ar yra visi skaičiai }
    var i, j: integer;
        a: aibe;
  begin
    a := [1..N*N];
    { inicializuojamos sumos }
    ist1 := 0; ist2 := 0;
    for i := 1 to n do
      begin
        e[i] := 0; s[i] := 0;
      end;
    { skaičiuojamos sumos }
    for i := 1 to n do
      for j := 1 to n do
        begin
          e[i] := e[i] + k[i, j];
          s[j] := s[j] + k[i, j];
          if i=j then ist1 := ist1 + k[i, j];
          if i+j = n+1 then ist2 := ist2 + k[i, j];
          a := a - [k[i, j]];
        end;
    visi := a = [];
  end; { sumos }

  procedure rikiuoti (var suma: lentele);
   { surikiuoja sumas didėjimo tvarka }
   { rikiuojama burbuliuko metodu }
      var i, t, nn: integer;
    begin
      nn := 2*n+2;
      i := 1;
      while i < nn do
        if suma[i] <= suma[i + 1]
           then i := i + 1
           else begin  { sukeičiame i-tąjį ir i+1-mąjį elementą }
                  t := suma[i];
                  suma[i] := suma[i + 1];
                  suma[i + 1] := t;
                  if i > 1 then i := i - 1
                           else i := i + 1;
                end
    end; { rikiuoti }

  procedure antimagiskas (var sekpr, sekpb: integer);
  { tikrinama, ar kvadratas yra antimagiškas }
    var e, s: lentele;
        i, ist1, ist2: integer;
        gerai: boolean;
        suma: lentele;
  begin
    sekpr := 0; sekpb := 0;
    sumos (e, s, ist1, ist2, gerai);
    if not gerai
       then exit; { jei lentelė užpildyta ne tais skaičiais,
                    toliau nėra prasmės tikrinti }

    { sumos surašomos į vieną masyvą }
    for i := 1 to n do
      begin
        suma[i] := e[i];
        suma[n+i] := s[i];
      end;
    suma[2*n+1] := ist1;
    suma[2*n+2] := ist2;
    rikiuoti (suma);
    { tikrinama, ar sumos sudaro ištisinę seką }
    gerai := true;
    for i := 1 to 2*n+1 do
      gerai := gerai and (suma[i] = suma[i+1]-1);
    if gerai
       then begin
              sekpb := suma[2*n+2];
              sekpr := suma[1];
            end;
  end; { antimagiškas }

  procedure skaityti (var n: integer; var k: kvadratas);
    var f: text;
        i, j: integer;
  begin
    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);
  end; { skaityti }

  var sekpr, sekpb: integer;
begin
  skaityti (n, k);
  antimagiskas (sekpr, sekpb);
  if sekpr = 0 { kvadratas nėra antimagiškas }
     then writeln (0)
     else writeln (sekpr, ' ', sekpb);
end.
