#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include<set>
#include<unordered_set>
#include<iomanip>
#include<queue>
#include<unordered_map>
#include<map>
#include<fstream>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define V vector
#define FOR1(i,a,b) for(int i=a; i<b; i++)
#define FOR(i,a) for (int i=0; i<a; i++)

int arr[2000];
V<pii>ans;
unordered_map<int, int>m1;
bool solve(int x, int n) {
	unordered_map<int, int>m = m1;
	ans.push_back({ arr[x],arr[2 * n - 1] });
	int ma = arr[2 * n - 1];
	m[arr[2 * n - 1]]--;
	m[arr[x]]--;
	for (int i = 2 * n - 2; i >= 0; i--) {
		if (m[arr[i]] > 0) {
			if (2 * arr[i] != ma) {
				if (m[ma - arr[i]] > 0) {
					m[arr[i]]--;
					m[ma - arr[i]]--;
					ans.push_back({ arr[i],ma - arr[i] });
					//	cout << x<<" "<<arr[i] << " " << ma - arr[i] << endl;
						//cout << m[ma - arr[i]] << endl;
					ma = max(arr[i], ma - arr[i]);
				}
				else {
					//cout << ma << " " << arr[i] << " " << endl;
					//cout << x << endl;
					return false;

				}
			}
			else {
				if (m[arr[i]] > 1) {
					m[arr[i]] -= 2;
					ans.push_back({ arr[i],arr[i] });
					ma = arr[i];
				}
				else return false;
			}
		}
	}
	return true;
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		ans.clear();
		int n;
		cin >> n;
		V<int>v;
		m1.clear();
		FOR(i, 2*n) {
			int a;
			cin >> a;
			v.push_back(a);
			if (m1.count(a) > 0) {
				m1[a]++;
			}
			else {
				m1[a] = 1;
			}
		}
		sort(v.begin(), v.end());
		FOR(i, 2 * n) {
			arr[i] = v[i];
		}
		V<int>possible;
		int index = 0;
		while (index < 2 * n - 1 && !solve(index, n)) {
			index++;
			ans.clear();
		}
		if (index == 2 * n - 1) {
			cout << "NO" << endl;
		}
		else {
			cout << "YES" << endl;
			cout << ans[0].first + ans[0].second << endl;
			FOR(i, n) {
				cout << ans[i].first << " " << ans[i].second << endl;
			}
		}
	}
}