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;

		long sum = 0;
		for ( int i = 0; i < K; ++ i ) {
			sum += f[i];
		}
		L = sum;

		sum = 0;
		for ( int i = 0; i < K; ++ i ) {
			sum += r[i];
		}
		L = Math.max( L, sum );

		for ( int fi = 0; fi < K; ++fi ) {
			for ( int ri = 0; ri < K; ++ri ) {
				M += Math.min( f[fi], r[ri] );
			}
		}
		res.L = L;
		res.M = M;
		return res;
	}
	static class Result {
		long L, M;
	}
}

