// Arup Guha
// 8/2/2013
// Solution to 2011 UCF Locals Problem: Music

import java.util.*;

public class music {

	final public static int UNFILLED = 1000;
	final public static int MAX = 255;

	public static void main(String[] args) {

		Scanner stdin = new Scanner(System.in);
		int numCases = stdin.nextInt();

		// Go through each case.
		for (int loop=1; loop<=numCases; loop++) {

			// Parameters for this case.
			int maxDelTracks = stdin.nextInt();
			int tolerance = stdin.nextInt();

			// Read in each existing track.
			int n = stdin.nextInt();
			int[][] tracks = new int[n][];
			for (int i=0; i<n; i++) {
				int size = stdin.nextInt();
				tracks[i] = new int[size];
				for (int j=0; j<size; j++)
					tracks[i][j] = stdin.nextInt();
			}

			// Header for this case.
			System.out.println("Case #"+loop+":");

			// Read in each new case and solve.
			n = stdin.nextInt();
			for (int i=1; i<=n; i++) {

				int size = stdin.nextInt();
				int[] newsong = new int[size];
				for (int j=0; j<size; j++)
					newsong[j] = stdin.nextInt();

				// Solve this case and output the result.
				if (solve(newsong, tracks, maxDelTracks, tolerance))
					System.out.println("Track #"+i+": Match found!");
				else
					System.out.println("Track #"+i+": Need to upload this track.");
			}
			System.out.println();
		}
	}

	public static boolean solve(int[] newsong, int[][] tracks, int maxDelTracks, int tolerance) {

		// Try matching to each song.
		for (int i=0; i<tracks.length; i++)
			if (isMatch(newsong, tracks[i], maxDelTracks, tolerance))
				return true;

		// Never found one.
		return false;
	}

	public static boolean isMatch(int[] newsong, int[] track, int maxDelTracks, int tolerance) {

		// Based on the problem spec.
		if (newsong.length > track.length) return false;

		// Weird special case.
		if (newsong.length == 0)
			return track.length <= 5*maxDelTracks;

		// Will store answers here.
		int[][][] memo = new int[newsong.length][track.length][maxDelTracks+1];
		for (int i=0; i<memo.length; i++)
			for (int j=0; j<memo[i].length; j++)
				Arrays.fill(memo[i][j], UNFILLED);

		// Try matching each number.
		memo[0][0][0] = Math.abs(newsong[0] - track[0]);
		for (int i=1; i<memo.length; i++)
			memo[i][i][0] = Math.max(memo[i-1][i-1][0], Math.abs(newsong[i] - track[i]));

		// Solve our query via dynamic programming - iterate through number of deleted segments.
		for (int del=1; del<=maxDelTracks; del++) {

			// Iterate through possible ending points in new song and the current track.
			for (int i=0; i<newsong.length; i++) {
				for (int j=i; j<track.length; j++) {

					// We can't match this pair, so skip.
					if (Math.abs(newsong[i] - track[j]) > tolerance) continue;

					int best = UNFILLED;

					if (i == 0) {
						if (j <= 5*del)
							best = Math.abs(newsong[i] - track[j]);
					}
					else {

						// Try just adding this track.
						best = Math.max(memo[i-1][j-1][del], Math.abs(newsong[i] - track[j]));

						// Try building off any previous sequence, adjusting for number of deleted tracks in between.
						for (int k=j-2; k>=0; k--) {
							int reduce = (j-k+3)/5;
							if (reduce > del) break;
							int cur = Math.max(memo[i-1][k][del-reduce], Math.abs(newsong[i] - track[j]));
							if (cur < best) best = cur;
							if (best == Math.abs(newsong[i] - track[j])) break;
						}
					}

					// Store our answer.
					memo[i][j][del] = Math.min(best, memo[i][j][del-1]);
				}
			}
		}

		// Look at all relevant matches to the last item in the new song.
		int retval = memo[newsong.length-1][track.length-1][maxDelTracks];
		for (int i=newsong.length-1; i<track.length; i++) {
			int extra = (track.length-1-i+4)/5;
			if (maxDelTracks-extra >=0 && memo[newsong.length-1][i][maxDelTracks-extra] < retval)
				retval = memo[newsong.length-1][i][maxDelTracks-extra];
		}

		// This determines if we have a match or not.
		return retval <= tolerance;
	}
}