#include using namespace std; typedef long long i64; bool Works(vector elems, vector >& ans, vector p) { vector sp; int N; i64 s = 0; for (auto i : elems) s += i; auto Save = [&](multiset elements) { ans.emplace_back(); for (auto i : elements) ans.back().push_back(i); vector new_elems; for (auto i : elems) { if (elements.find(i) != elements.end()) elements.erase(elements.find(i)); else new_elems.push_back(i); } elems = new_elems; N = (int)elems.size(); sp = vector (elems.size()); for (int i = 0; i < N; i++) { sp[i] = elems[i]; if (i) sp[i] += sp[i - 1]; } }; Save({}); ans.pop_back(); for (auto nr : p) { // try to take as much as possible, without going over S/2 multiset taken; i64 sum_act = 0; int nr_taken = 0; for (int i = N - 1; i >= 0 && nr_taken < nr; i--) { // try to take elems[i] i64 new_sum = sum_act + elems[i]; if (nr_taken + 1 < nr) new_sum += sp[nr - nr_taken - 2]; if (2 * new_sum < s) { taken.insert(elems[i]); nr_taken++; sum_act += elems[i]; } } if ((int)taken.size() != nr) return false; Save(taken); } if (elems.size() != 0) return false; return true; } void Test() { int N, A, B, C; cin >> N >> A >> B >> C; vector elems(N); for (auto& i : elems) cin >> i; sort(elems.begin(), elems.end()); vector p = { A, B, C }; sort(p.begin(), p.end()); vector > ans; do { if (Works(elems, ans, p)) { cout << "YES\n"; auto ansa = ans[0], ansb = ans[1], ansc = ans[2]; if ((int)ansb.size() == A) swap(ansa, ansb); if ((int)ansc.size() == A) swap(ansa, ansc); if ((int)ansc.size() == B) swap(ansc, ansb); for (auto i : ansa) cout << i << ' '; cout << '\n'; for (auto i : ansb) cout << i << ' '; cout << '\n'; for (auto i : ansc) cout << i << ' '; cout << '\n'; return; } } while (next_permutation(p.begin(), p.end())); cout << "NO\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int T; cin >> T; while (T--) { Test(); } }