import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Stavitel {
	private static String line;
	private static String[] nums;
	private static int[] stlpec;
	private static int[] riadok;
	private static int maximum;
	private static int minimum;

	private static int[] riadkove;
	private static int[] stlpcove;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		line = br.readLine();
		int pocetSad = Integer.parseInt(line);

		riadkove = new int[100001];
		stlpcove = new int[100001];

		while (pocetSad-- > 0) {
			maximum = 0;
			minimum = 0;

			line = br.readLine();
			int rozmer = Integer.parseInt(line);
			Arrays.fill(riadkove, 0);
			Arrays.fill(stlpcove, 0);

			riadok = new int[rozmer];
			stlpec = new int[rozmer];

			line = br.readLine();
			nums = line.split(" ");
			for (int i = 0; i < riadok.length; i++) {
				riadok[i] = Integer.parseInt(nums[i]);
				riadkove[riadok[i]]++;
			}

			line = br.readLine();
			nums = line.split(" ");
			for (int i = 0; i < stlpec.length; i++) {
				stlpec[i] = Integer.parseInt(nums[i]);
				stlpcove[stlpec[i]]++;
			}

			najdiMaximum();
			najdiMinimum();
			vypis();
		}
	}

	private static void najdiMinimum() {
		for (int i = 0; i < stlpcove.length; i++) {
			minimum += Math.max(riadkove[i], stlpcove[i]) * i;
		}
	}

	private static void najdiMaximum() {
		for (int i = 0; i < riadok.length; i++) {
			for (int j = 0; j < stlpec.length; j++) {
				maximum = maximum + Math.min(riadok[i], stlpec[j]);
			}

		}
	}

	private static void vypis() {
		System.out.println("Minimalni budova obsahuje " + minimum
				+ " kostek, maximalni " + maximum + " kostek.");

	}
}
