program zaidimas;
  { 107 u‘davinys }
  const MAX_N = 5;
        MAX_M = 5;
        MAX = MAX_N div 2 + MAX_M + 2; { maksimalaus kvadrato, kuriame telpa }
         { lenta, kražtin‚, žiuo atveju 15; lenta apgaubiama tuž‡iais }
         { langeliais }
        MAX_K = 150; { maksimalus kirtim— skai‡ius }
  type t_lenta = array [-MAX..MAX, -MAX..MAX] of integer;
                                               { 1 - žažk‚, 0 - tuž‡ia }
                                               { -1 - u‘ lentos rib— }
       kirtimai = array [0..MAX_K] of record
                                        x1, y1, x2, y2: integer
                                      end;

  procedure duomenys (var dydis, sa: integer; var lenta: t_lenta);
  { nuskaito pradinius duomenis, bei randa lentos dydŤ - t. y.  }
  { minimalaus kvadrato, Ť kurŤ telpa lenta, kražtin‚s pusŠ }
    var i, j, x, y, m, n: integer;
        f: text;
  begin
    for i := -MAX to MAX do
      for j := -MAX to MAX do
        lenta[i, j] := -1;
    assign (f, 'SASKES.DAT' );
    reset (f);
    readln (f, m, n );
    dydis := n div 2 + m;  { lentos dydis }
    { pa‘ymime lentos langelius }
    for i := -dydis + m to dydis - m do
      for j := - dydis to dydis do
        lenta[i, j] := 0;
    for i := - dydis to dydis do
      for j := -dydis + m to dydis - m do
        lenta[i, j] := 0;
    { sud‚liojame žažkes }
    readln (f, sa);
    for i := 1 to sa do
      begin
        readln (f, x, y);
        lenta[x, y] := 1;
      end;
    close (f);
   dydis := dydis + 2;
  end; { duomenys }

  procedure saskes (dydis, { lentos dydis }
                    sa: integer; { žažki— skai‡ius lentoje }
                    lenta: t_lenta;
                    var nuk: kirtimai; { kirtim— seka }
                    var rasta: boolean { ar rastas sprendinys });
    var k: integer;     { nukirst— žažki— skai‡ius }

    procedure kirsti (x1, y1, x2, y2: integer);
    { rekursin‚ proced–ra, atliekanti kirtimus }
      var i, j: integer;
    begin
      k := k + 1;
      nuk[k].x1 := x1;              nuk[k].y1 := y1; { Ťsid‚mime kirtim… }
      nuk[k].x2 := x2 + (x2 - x1);  nuk[k].y2 := y2 + (y2 - y1);
      lenta[x1, y1] := 0;
      lenta[x2, y2] := 0;
      lenta[x2 + (x2 - x1), y2 + (y2 - y1)] := 1;
      if k = sa - 1
         then rasta := true;
      for i := -dydis to dydis do
        for j := -dydis to dydis do
          if (lenta[i, j] = 1) and not rasta
             then if (lenta[i, j+1] = 1) and (lenta[i, j+2] = 0)
                     then kirsti (i, j, i, j+1)
             else if (lenta[i, j-1] = 1) and (lenta[i, j-2] = 0)
                     then kirsti (i, j, i, j-1)
             else if (lenta[i-1, j] = 1) and (lenta[i-2, j] = 0)
                     then kirsti (i, j, i-1, j)
             else if (lenta[i+1, j] = 1) and (lenta[i+2, j] = 0)
                     then kirsti (i, j, i+1, j);
      { gr…‘iname nukirst… žažkŠ Ť viet… }
      if not rasta
         then begin
                k := k - 1;
                lenta[x1, y1] := 1;
                lenta[x2, y2] := 1;
                lenta[x2 + (x2 - x1), y2 + (y2 - y1)] := 0;
              end;
    end; { kirsti }

  begin  { žažk‚s }
    rasta := false;
    k := -1;
    { pirmasis kirtimas bus fiktyvus }
    kirsti (dydis, dydis, dydis, dydis)
  end;   { žažk‚s }

  procedure rezultatai (rasta: boolean; nuk: kirtimai; sa: integer);
  { spausdina rezultatus }
    var f: text;
        i: integer;
  begin
    assign (f, 'SASKES.REZ');
    rewrite (f);
    if not rasta
    then writeln (f, 'NEGALIMA')
    else for i := 1 to sa - 1 do
          writeln (f, nuk[i].x1,' ',nuk[i].y1,' ',nuk[i].x2,' ',nuk[i].y2);
    close (f)
  end; { rezultatai }

  var dydis, sa: integer;
      lenta: t_lenta;
      nuk: kirtimai;
      rasta: boolean;
begin
  duomenys (dydis, sa, lenta);
  saskes (dydis, sa, lenta, nuk, rasta);
  rezultatai (rasta, nuk, sa);
end.

