Четвёртый открытый Зеленоградский турнир 2008

const
    GOOD_SIZE = 2;
    GOOD_SIZE2 = 2;
    MEGA_SIZE = 7;
    WINNINGS = 1300;
type
    int = word;
    integer = word;
    Arr = array[0..100] of int;
    AArr = array[0..100] of Arr;

Var
    LAST: integer;
    amount: array[0..51] of integer;
    ttt, t: longint;
    bx, by: Array[0..10000] of int;
    tm: AArr;
    n, m, c: int;
tot: int = 0;
{}
    dx : array[1..4] of shortint = (0, 0, 1, -1);
    dy : array[1..4] of shortint = (1, -1, 0, 0);
{}
procedure gen();
var
    i, j: int;
begin
     writeln('4 90 10');
     for i := 1 to 100 do begin
         for j := 1 to 90 do write(random(10), ' ');
        writeln;
     end;
     writeln;
end;
{}
procedure big(var a: aarr);
var
   used: array[0..100,0..100] of int;
   size, left, right: array[0..10000] of int;
   yn, k, i, j, temp, max: int;
procedure dfs(u, v: int);
var dir: int;
    nx, ny: shortint;
begin
     inc(size[k]);
     used[u][v] := k;
     if v < left[k] then left[k] := v;
     if v > right[k] then right[k] := v;
     for dir := 1 to 4 do
        begin
            nx := dx[dir] + u;
            ny := dy[dir] + v;
            if (ny >= m) or (ny < 0) or (nx >= n) or (nx < a[n][ny]) then Continue;
            if used[nx][ny]>0 then Continue;
            if a[nx][ny] <> a[u][v] then Continue;
            dfs(nx, ny);
        end;
end;


begin

     while true do begin
         k := 0;
         yn := 0;
         max := 1;
         fillchar(used ,sizeof(used), 0);
         for j := 0 to m - 1 do
         for i := n - 1 downto a[n][j] do
         begin
            if a[i][j] = LAST then Continue;
            if max >= GOOD_SIZE then break;
            if used[i][j] > 0 then Continue;
            inc(k);
            size[k] := 0;
            left[k] := j;
            right[k] := j;
            dfs(i, j);
            if (size[k] > max) then begin
               yn := k;
               max := size[k];
            end;
         end;
         {}
          if max < 2 then begin
         for j := 0 to m - 1 do
          for i := a[n][j] to n - 1 do
         begin
            if max >= GOOD_SIZE2 then break;
            if used[i][j] > 0 then Continue;
            inc(k);
            size[k] := 0;
            left[k] := j;
            right[k] := j;
            dfs(i, j);
            if (size[k] > max) then begin
               yn := k;
               max := size[k];
            end;
         end;
          end;

          if max < 2 then break;
          {}

        inc(bx[0]);
        inc(by[0]);
        for j := left[yn] to right[yn] do begin
            temp := a[n][j];
            a[n][j] := n;
            for i := n - 1 downto temp do begin
                if used[i][j] <> yn then begin
                   dec(a[n][j]);
                   a[       a[n][j]      ][     j   ] := a[i][j];
                end else begin
                   bx[bx[0]] := i;
                   by[by[0]] := j;
                end;
            end;
        end;
     end;
end;
{}
procedure work();
var i, j, mx: int;
begin
     read(n, m, c);
          FillChar(amount, sizeof(amount), 0);
          last := 0;
          mx := 0;
     for i := 0 to n - 1 do
        for j := 0 to m - 1 do begin
           read(tm[i][j]);
           tm[n][j] := 0;
           inc(amount[tm[i][j]]);
           if amount[tm[i][j]] > mx then begin
               mx := amount[tm[i][j]];
               last := tm[i][j];
           end;
     end;

     bx[0] := 0;
     by[0] := 0;
     if not((mx >= WINNINGS) or (c <= 7)) then begin
        writeln('N');
     end else
     begin
         big(tm);
         writeln('Y');
         for i := 1 to bx[0] do
               writeln(bx[i], ' ', by[i]);
           writeln('-1 -1');
     end;
end;
{}
begin
     read( t );
     for ttt := 1 to t do work();
end.