{
TASK: MUSIS
LANG: PASCAL
}

program PO_MUSIO;
  const MAX_LENTOS_DYDIS = 100;
  const MAX_RAITININKU = 100;

   CONST FIN = 'MUSIS.DAT';
         RZF = 'MUSIS.REZ';

  type TAtstumai = array [1..MAX_LENTOS_DYDIS, 1..MAX_LENTOS_DYDIS] of integer;
       TLentosKoor = record
                      e : 1..MAX_LENTOS_DYDIS;
                      s : 1..MAX_LENTOS_DYDIS;
                     end;
       TPriesas = array [1..MAX_LENTOS_DYDIS, 1..MAX_LENTOS_DYDIS] of boolean;

  var
      M : 1..MAX_LENTOS_DYDIS;
      e, s : 1 .. MAX_LENTOS_DYDIS;

      {raitininkuSkaicius skaicius}
      raitininkuSkaicius : 0..MAX_RAITININKU;
      r : 0 .. MAX_RAITININKU;

      {pradine karaliaus padetis}
      karalius : TLentosKoor;

      {atstumai nuo karaliaus iki visu lentos langeliu}
      karAtst : TAtstumai;

      {pradines raitininku padetys}
      rait : array [1..MAX_RAITININKU] of TLentosKoor;

      {raitAtst[i] - atstumai nuo i-ojo raitininko iki visu lentos langeliu}
      raitAtst : array [1..MAX_RAITININKU] of TAtstumai;

      {prieso langeliu skaicius}
      priesuSkaicius : 0 .. MAX_LENTOS_DYDIS * MAX_LENTOS_DYDIS;
      p : 0 .. MAX_LENTOS_DYDIS * MAX_LENTOS_DYDIS;

      {prieso langeliu issidestymas}
      priesas : TPriesas;

      {geriausias rastas rezultatas}
      rekEjimuSk : integer;
      ejimuSk : integer;


  {Randa visus atstumus(raitiniko ejimu) nuo langelio pradzia
   iki visu lentos langeliu.
   Atstumas -1 reiskia, kad langelis nepasiekiamas}
  procedure raskAtstumus(var pradzia : TLentosKoor; var atst: TAtstumai);
    {Vykdome paieska platyn}
    const MAX_EILES_ILGIS = MAX_LENTOS_DYDIS * MAX_LENTOS_DYDIS;
    var eile : array [1..MAX_EILES_ILGIS] of TLentosKoor;
        eilesPradzia, eilesPabaiga : integer;
        l, nl : TLentosKoor;
        nlAtst : integer;
        ejimas : 1..8;
        e, s : 1 .. MAX_LENTOS_DYDIS;
    procedure eileIsvalyti;
    begin
       eilesPradzia := 1;
       eilesPabaiga := 1;
    end;
    function eileTuscia : boolean;
    begin
       eileTuscia := eilesPradzia = eilesPabaiga;
    end;
    function isimtiIsEiles : TLentosKoor;
    begin
      isimtiIsEiles := eile[eilesPradzia];
      eilesPradzia := eilesPradzia + 1;
    end;
    procedure idetiIEile(var l:TLentosKoor);
    begin
       eile[eilesPabaiga] := l;
       eilesPabaiga := eilesPabaiga + 1;
    end;
    function eiti(ejimas : integer; var l: TLentosKoor; var nl : TLentosKoor) : boolean;
       var ce, cs : integer;
           e, s : integer;
    begin
       case ejimas of
         1: begin ce := 2; cs := 1 end;
         2: begin ce := 2; cs := -1 end;
         3: begin ce := 1; cs := 2 end;
         4: begin ce := -1; cs := 2 end;
         5: begin ce := -2; cs := 1 end;
         6: begin ce := -2; cs := -1 end;
         7: begin ce := 1; cs := -2 end;
         8: begin ce := -1; cs := -2 end;
       end;
       e := l.e + ce; s := l.s + cs;
        if (e >= 1) and (e <= M) and (s >= 1) and (s <= M) then begin
         nl.e := e; nl.s := s;
          eiti := true;
        end else begin
          eiti := false;
        end;
    end;

  begin
    eileIsvalyti();
    for e := 1 to M do
      for s := 1 to M do begin
        atst[e, s] := -1;
      end;
    atst[pradzia.e, pradzia.s] := 0;
    idetiIEile(pradzia);
    while not eileTuscia() do begin
      l := isimtiIsEiles();
      nlAtst := atst[l.e, l.s] + 1;
      for ejimas := 1 to 8 do begin
        if eiti(ejimas, l, nl) then begin
          if not priesas[nl.e, nl.s] and (atst[nl.e, nl.s] = -1) then begin
       atst[nl.e, nl.s] := nlAtst;
            idetiIEile(nl);
          end;
        end;
      end;
    end;
  end;


  {Ivertina susitikimo langeli (e,s).
   Jei langelyje gali susitikti visos figuros, tai funkcijos reiksme true ir
   ejimuSk - minimalus ejimu iki susitikimu langelio skaicius}
  function susitikimoLangelis(e, s : integer; var ejimuSk: integer) : boolean;
    var r : integer;
        geriausiasSkirtumasKaiNesaKaraliu, skirtumas : integer;
        skirtumasNustatytas : boolean;
        raitininkuAtstSuma : integer;
        karaliusPasiekiamas : boolean; {ar bent vienas raitininkas gali ateiti iki karaliaus}
        langelisPasiekiamas : boolean; {ar visi raitininkai gali patekti i langeli (e,s)}
  begin
     langelisPasiekiamas := true;
     karaliusPasiekiamas := false;
     r := 1;
     while (r <= raitininkuSkaicius) and langelisPasiekiamas do begin
       {ar r-as raitininkas gali pasiekti langeli (e,s)}
       langelisPasiekiamas := raitAtst[r][e, s] >= 0;
       if not karaliusPasiekiamas then begin
          {ar r-as raitininkas gali ateiti iki karaliaus}
          karaliusPasiekiamas := raitAtst[r][karalius.e, karalius.s] >= 0;
       end;
       r := r + 1;
     end;
     if (not langelisPasiekiamas) or {ne visi raitininkai gali patekti i (e,s)}
        (karAtst[e, s] < 0) or {karaliaus nera (e,s) ir raitininkas jo ten nunesti negali}
        ((karAtst[e, s] > 0) and not karaliusPasiekiamas)
           {karaliu reikia nesti, bet pas ji negali ateiti joks raitininkas}
       then begin
        {langelyje (e, s) susitikimas neimanomas}
        susitikimoLangelis := false;
     end else begin
       {Ieskome, kuriam raitinikui labiausiai apsimoka nesti karaliu i
        susirinkimo langeli (e,s). Kiekvienam raitininkui randame skirtuma
        tarp atstutmu, kai raitininkas nesa karaliu arba eina tiesiai i
        susirinkimo langeli ir tarp siu skirtumu isrenkame maziausia}
       skirtumasNustatytas := false;
       geriausiasSkirtumasKaiNesaKaraliu := 0;
       raitininkuAtstSuma := 0;
       for r := 1 to raitininkuSkaicius do begin
         if raitAtst[r][karalius.e, karalius.s] >= 0 then begin
           {r-as raitininkas gali ateiti iki karaliaus}
           skirtumas := raitAtst[r][karalius.e, karalius.s] + karAtst[e, s] -
                        raitAtst[r][e, s];
           if (not skirtumasNustatytas) or
              (skirtumas < geriausiasSkirtumasKaiNesaKaraliu) then begin
             geriausiasSkirtumasKaiNesaKaraliu := skirtumas;
             skirtumasNustatytas := true;
           end;
         end;
         raitininkuAtstSuma := raitininkuAtstSuma + raitAtst[r][e, s];
       end;

       ejimuSk := raitininkuAtstSuma + geriausiasSkirtumasKaiNesaKaraliu;
       susitikimoLangelis := true;
     end;
  end;
 var ff: text;
begin

  assign (ff, FIN);
  reset (ff);
  readln(ff, M, raitininkuSkaicius, priesuSkaicius);
  readln(ff, karalius.e, karalius.s);
  for r := 1 to raitininkuSkaicius do begin
    readln(ff, rait[r].e, rait[r].s);
 end;
 for e := 1 to M do
   for s := 1 to M do begin
     priesas[e, s] := false;
    end;
  for p := 1 to priesuSkaicius do begin
    readln(ff, e, s);
    priesas[e, s] := true;
  end;
  close (ff);

  raskAtstumus( karalius, karAtst);
  for r := 1 to raitininkuSkaicius do begin
    raskAtstumus(rait[r], raitAtst[r]);
  end;

  rekEjimuSk := -1; {geriausias rastas rezultatas}
  for e := 1 to M do
    for s := 1 to M do begin
      if susitikimoLangelis(e, s, ejimuSk) then begin
        if (rekEjimuSk = -1) or (ejimuSk < rekEjimuSk) then begin
          rekEjimuSk := ejimuSk;
        end;
      end;
    end;

  assign (ff, RZF);
  rewrite (ff);
  writeln(ff, rekEjimuSk);
  close (ff);

end.

