import java.io.*;
import java.util.*;

class Stavitel {

	static boolean DEBUG = false;

	public static void main( String[] args ) throws Exception {
		BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
		int T = Integer.parseInt( br.readLine()	);
		StringTokenizer tok;
		String line;
		while ( T-- > 0 ) {
			int K = Integer.parseInt( br.readLine()	);
			// f
			int f[] = new int[K];
			line = br.readLine();
			tok = new StringTokenizer( line );
			for ( int i = 0; i < K; ++i ) {
				f[i] = Integer.parseInt( tok.nextToken() );
			}
			if (DEBUG) System.out.printf( "DEBUG: f=%s\n", Arrays.toString( f ) );
			
			// r
			int r[] = new int[K];
			line = br.readLine();
			tok = new StringTokenizer( line );
			for ( int i = 0; i < K; ++i ) {
				r[i] = Integer.parseInt( tok.nextToken() );
			}
			if (DEBUG) System.out.printf( "DEBUG: r=%s\n", Arrays.toString( r ) );
			Result res = solve( K, f, r );
			System.out.printf( "Minimalni budova obsahuje %d kostek, maximalni %d kostek.\n", res.L, res.M );
		}
	}

	static Result solve( int K, int[] f, int[] r ) {
		Result res = new Result();
		long L = 0;
		long M = 0;

		for ( int fi = 0; fi < K; ++fi ) {
			for ( int ri = 0; ri < K; ++ri ) {
				M += Math.min( f[fi], r[ri] );
			}
		}

		L = min(K, f, r );

		res.L = L;
		res.M = M;
		return res;
	}

	static long min( int K, int[] f, int[] r ) {
		long res = 0;
		Arrays.sort( f );
		Arrays.sort( r );
		while ( f[K-1] != -1 || r[K-1] != -1 ) {
			//System.out.println( "f=" + Arrays.toString(f) );
			//System.out.println( "r=" + Arrays.toString(r) );
			if ( f[ K-1 ] == r[ K-1 ] ) {
				res += f[K-1];
				f[ K-1 ] = -1;
				r[ K-1 ] = -1;
			} else {
				if ( f[K-1] > r[K-1] ) {
					res += f[K-1];
					f[K-1] = -1;
				} else {
					res += r[K-1];
					r[K-1] = -1;
				}
			}
			Arrays.sort( f );
			Arrays.sort( r );
		}
		return res;
	}

	static class Result {
		long L, M;
	}
}

