import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Scanner;

public class JumpKnightSolDavid {

	static final int oo=1_000_000_000;
	
	public static void main(String[] args) {
		Scanner fs=new Scanner(System.in);
		int T=fs.nextInt();
		for (int tt=0; tt<T; tt++) {
			int n=fs.nextInt(), nKnights=fs.nextInt(), jumpDist=fs.nextInt();
			int[][] board=new int[n][n];
			for (int y=0; y<n; y++) for (int x=0; x<n; x++) board[x][y]=fs.nextInt();
			int[] knightXs=new int[nKnights], knightYs=new int[nKnights];
			for (int i=0; i<nKnights; i++) {
				knightYs[i]=fs.nextInt()-1; knightXs[i]=fs.nextInt()-1;
			}
			int startY=fs.nextInt()-1, startX=fs.nextInt()-1;
			ArrayDeque<Integer> xs=new ArrayDeque<>(), ys=new ArrayDeque<>();
			int[][] dist=new int[n][n];
			for (int i=0; i<n; i++) Arrays.fill(dist[i], oo);
			dist[startX][startY]=0;
			xs.add(startX); ys.add(startY);
			int[] dx= {2, 2, 1, -1, -2, -2, -1, 1};
			int[] dy= {1, -1, -2, -2, -1, 1, 2, 2};
			while (!xs.isEmpty()) {
				int x=xs.removeFirst(), y=ys.removeFirst();
				int curDist=dist[x][y];
				for (int dd=0; dd<8; dd++) {
					int nx=x+dx[dd], ny=y+dy[dd], nd=curDist+1;
					if (nx<0||ny<0||nx>=n||ny>=n||dist[nx][ny]<=nd || Math.abs(board[x][y]-board[nx][ny])>jumpDist)
						continue;
					xs.addLast(nx);
					ys.addLast(ny);
					dist[nx][ny]=nd;
				}
			}
			int minDist=oo, minKnight=-1;
			for (int i=0; i<nKnights; i++) {
				if (dist[knightXs[i]][knightYs[i]]<minDist) {
					minDist=dist[knightXs[i]][knightYs[i]];
					minKnight=i;
				}
			}
			if (minDist==oo) {
				System.out.println(-1);
			}
			else {
				System.out.println(minDist+" "+(minKnight+1));
			}
		}
	}

}
