{$M 65520,0,655360}
program netvarkingas_bibliotekininkas;
  { 132 u‘davinys }
  const MAX_L = 100;  { maksimalus leidini— skai‡ius }
        MAX_P = 2000; { maksimalus pozicij— skai‡ius }
  type lentele = array [1..MAX_L] of integer;
       lentyna = array [1..MAX_P] of integer;
       duomenys = array [1..MAX_L]
                    of record
                         kiek, { kiek leidinio tom— pavyko ižd‚lioti }
                         pask: integer; { paskutinio pad‚to tomo vieta }
                       end;
   { ‘emiau suražyti globalieji kintamieji }
   var n,  { leidini— skai‡ius }
       pozicijos: integer; { pozicij— skai‡ius lentynoje }
       vieta, skaic: lentele; { pirmoji lentel‚ }
       perr2: lentyna;        { antroji lentel‚ }

  function uz_ribu: integer;
  { tikrina, ar n‚ra nuorodos Ť neegzistuojan‡i… pozicij… }
    var i, poz: integer;
  begin
    poz := 0;
    for i := 1 to pozicijos do
      if (perr2[i] < -1) or (perr2[i] > pozicijos)
          then poz := i;
    uz_ribu := poz
  end; { u‘_rib— }

  procedure delioti (var leid: duomenys; var lent: lentyna);
  { bando d‚lioti knygas lentynoje }
  { leid - kiekvieno leidinio ižd‚liot— tom— skai‡ius ir paskutinio tomo }
  { vieta, lent - rodo kurioje pozicijoje kurio leidinio tomai yra }
    var tomas, buvo, l, i, poz: integer;
  begin
    { inicializuojame masyvus leid ir lent }
    for l := 1 to n do
      begin
        leid[l].kiek := 0;
        leid[l].pask := 0;
      end;
    for i := 1 to pozicijos do
      if perr2[i] = 0
         then lent[i] := 0
         else lent[i] := -2;   { nei viena pozicija lentynoje neu‘imta }
    { d‚liosime kiekvieno leidinio tomus }
    for l := 1 to n do
      begin
        buvo := 0;           { buvusi pozicija }
        poz := vieta[l];     { pirmojo tomo vieta }
        tomas := 0;          { kiek tom— sud‚liota }
        while (poz <> -1) and (poz <> 0) do
          { kol nepri‚jome paskutinio tomo ar nuorodos Ť nulinŠ pozicij… }
          if (poz > 0)
          then if lent[poz] <> -2 { pri‚jome u‘imt… viet… }
               then poz := 0
               else begin
                      lent[poz] := l; { žioje vietoje yra leidinys l }
                      tomas := tomas + 1;
                      buvo := poz;
                      poz := perr2[poz];
                    end;
        { Ťsimename duomenis apie l-t…jŤ leidinŤ }
        leid[l].kiek := tomas;
        leid[l].pask := buvo;
      end
  end; { d‚lioti }

  function kiek (x: integer): integer;
  { kiek kart— skai‡ius x pasikartoja perražytoje lentel‚je }
    var i, sk: integer;
  begin
    sk := 0;
    for i := 1 to pozicijos do
      if perr2[i] = x
         then sk := sk + 1;
    kiek := sk
  end; { kiek }

  procedure nuoroda (x: integer;
                     var sk, { langeli— skai‡ius }
                     n1, n2: integer { iž kuri— langeli— rodoma Ť x });
  { iežko kuriame langelyje Ťražytas skai‡ius x }
  { nuorod… iž pirmosios lentel‚s ‘ym‚sime neigiamu skai‡iumi }
    var poz, i, l: integer;
  begin
    n1 := 0; n2 := 0;
    { tikrina ar n‚ra nuorodos iž pirmosios lentel‚s }
    for l := 1 to n do
      if vieta[l] = x
         then n1 := -l; { nuorod… iž pirmosios lentel‚s }
                 { susitarkime ‘ym‚ti neigiamu skai‡iumi }
    { tikrina ar n‚ra tokios nuorodos antroje lentel‚je }
    for i := 1 to pozicijos do
      if (perr2[i] = x)
         then if n1 = 0 then n1 := i
                        else n2 := i;
    sk := ord (n1 <> 0) + ord (n2 <> 0)
  end; { nuoroda }

  procedure ieskoti0 (var kl_vieta: integer);
  { taiso klaid… - nuorod… Ť nulinŤ langelŤ }
  { kl_vieta = 0, jei tokia klaida nepadaryta }
    var poz, i, l, sk, turi0, x1, x2: integer;
  begin
    poz := 0; { iežkome nuorodos Ť nulŤ iž pirmosios }
    for l := 1 to n do
      if perr2[vieta[l]] = 0
         then poz := -l;
    { ir iž antrosios lentel‚s }
    for i := 1 to pozicijos do
      if perr2[i] > 0       { jei tai nuoroda Ť kit… langelŤ }
         then if perr2[perr2[i]] = 0
                 then poz := i;
    if poz <> 0   { jei nuoroda yra }
       then begin
              { rasime kiek nuli— turi b–ti lentel‚je }
               turi0 := pozicijos;
               for l := 1 to n do
                 turi0 := turi0 - skaic[l];
               if turi0 = kiek(0)
                  then { vietoj skai‡iaus Ťražytas skai‡ius, rodantis Ť nulŤ }
                     if poz < 0
                        then kl_vieta := vieta[-poz]
                        else kl_vieta := poz
                  else if poz < 0  { vietoj skai‡iaus Ťražytas 0 }
                         then kl_vieta := vieta[-poz]
                         else kl_vieta := perr2[poz];
            end;
  end; { iežkoti0 }

  procedure galas (leid: duomenys; var kl_vieta: integer);
  { taisoma klaida, kai pamestas vienos grandin‚s galas }
    var l: integer;
  begin
    { rasime klaidingai perražyto leidinio numerŤ }
    l := 1;
    while (l <= n) and (leid[l].kiek = skaic[l]) do
      l := l + 1;
    kl_vieta := leid[l].pask
  end; { galas }

  procedure du_langeliai (lent: lentyna; leid: duomenys;
                          n1, n2: integer; var kl_vieta: integer);
  { taisoma klaida, kai Ť du langelius (n1 ir n2) Ťražytas tas pats skai‡ius }
    var poz, i, pam, bendra, l1, l2: integer;
  begin
    { pirmoje lentel‚je klaidos negali b–ti }
    if n1 < 0  then kl_vieta := n2 { n1 - nuoroda iž pirmos lentel‚s }
               else if n2 < 0 then kl_vieta := n1;
    if kl_vieta <> 0 then exit;

    { rasime leidinius, kuri— tomai žiose pozicijose }
    l1 := lent[n1]; l2 := lent[n2];
    { gal buvo pamestas vienos grandin‚s vidurys }
    if l1 = -2 then kl_vieta := n2
      else if l2 = -2 then kl_vieta := n1;
    if kl_vieta <> 0 then exit;

    { gal susidar‚ ciklas vienoje grandin‚je }
    if l1 = l2
       then kl_vieta := leid[l1].pask;
    if kl_vieta <> 0 then exit;
    { jei ne, tada susiliejo dvi grandin‚s }
    { rasime pamest— pozicij— skai‡i— }
    pam := 0;
    for i := 1 to pozicijos do
      if lent[i] = -2
         then pam := pam + 1;
    { rasime bendr… abiej— grandini— dalŤ }
    bendra := 0;
    poz := perr2[n1];
    while poz <> -1 do
      begin
        bendra := bendra + 1;
        poz := perr2[poz];
      end;
    if bendra <> pam  { bendra dalis nelygi pamestai }
       then if (perr2[n1] = l1) and (leid[l2].kiek+bendra = skaic[l2]) or
               (perr2[n2] = l2) and (leid[l1].kiek+bendra <> skaic[l1])
               then kl_vieta := n2
               else kl_vieta := n1
       { else - atstatyti neŤmanoma }
  end; { du_langeliai }

  procedure ieskoti_vietos (lent: lentyna; leid: duomenys;
                            var kl_vieta: integer);
  { iežko pozicijos, kurioje padaryta klaida }
    var poz, i, l, sk, n1, n2: integer;
  begin
    kl_vieta := 0;
    { gal b–t yra nuoroda Ť nulinŤ element… }
    ieskoti0 (kl_vieta);
    if kl_vieta = 0   { jei tokios klaidos nerasta }
       then begin     { iežkome kit— klaid—
              { gal ta pati pozicija Ťražyta Ť du langelius }
              sk := 0; i := 1;
              while (sk <> 2) and (i <= pozicijos) do
                begin
                  if perr2[i] <> 0 then nuoroda (i, sk, n1, n2);
                  i := i + 1;
                end;
              if sk = 2
                 then du_langeliai (lent, leid, n1, n2, kl_vieta)
                 else galas (leid, kl_vieta);
             end;
  end; { iežkoti_vietos }

  procedure ieskoti_skaiciaus (var kl_sk: integer);
  { iežko teisingos reikžm‚s }
    var i, sk, n1, n2: integer;
  begin
    if kiek(-1) < n
       then kl_sk := -1
       else begin
              for i := 1 to pozicijos do
                begin
                  if perr2[i] <> 0 then nuoroda (i, sk, n1, n2);
                  if sk = 0  then kl_sk := i
                end;
            end;
  end; { iežkoti_skai‡iaus }

  procedure atstatyti (var yra: boolean; var kl_vieta, kl_sk: integer);
  { patikrina, ar antroje lentel‚je yra klaida ir jei galima, }
  { j… atstato }
    var l, poz: integer;
        leid: duomenys;
        lent: lentyna;
  begin
    { jei yra nuorod… Ť neegzistuojan‡i… pozicij…, ži… klaid… kei‡iame kita }
    poz := uz_ribu;
    if poz > 0
       then perr2 [poz] := 0;
    { ižd‚liojame knygas }
    delioti (leid, lent);
    yra := false;
    for l := 1 to n do
      if (leid[l].kiek <> skaic[l]) or (perr2[leid[l].pask] <> -1)
         then yra := true
         else begin
                ieskoti_skaiciaus (kl_sk);
                ieskoti_vietos (lent, leid, kl_vieta)
              end;
  end; { atstatyti }

  var f: text;
      i, kl_vieta, kl_sk: integer;
      yra: boolean; { ar yra klaid— lentel‚je }
begin
  assign (f, 'KNYGOS.DAT');
  reset (f);
  readln (f, n); { leidini— skai‡ius }
  for i := 1 to n do
    readln (f, vieta[i], skaic[i]);
  readln (f, pozicijos);
  for i := 1 to pozicijos do
    readln (f, perr2[i]);
  close (f);

  atstatyti (yra, kl_vieta, kl_sk);

  if not yra
     then writeln ('GERAI')
     else if kl_vieta = 0
             then writeln ('BLOGAI')
             else writeln (kl_vieta, ' ', kl_sk);
end.
