#include "bits/stdc++.h" using namespace std; using LL = long long; using ll = long long; #define all(x) begin(x),end(x) void solve() { int n; cin >> n; array ns; cin >> ns[0] >> ns[1] >> ns[2]; vector x(n); LL s = 0; for (int i = 0; i < n; ++i) { cin >> x[i]; s += x[i]; } auto goodmax = [&](LL mx) -> bool { return 2*s <= 6*mx && 6*mx < 3*s; }; sort(all(x)); vector bigs; while (!x.empty() && 6*x.back() >= s) { bigs.push_back(x.back()); x.pop_back(); } int m = bigs.size(); assert(m <= 6); vector prf(n - m + 1, 0); for (int i = 0; i < n - m; ++i) { prf[i + 1] = prf[i] + x[i]; } for (int i = 0; i < 3; ++i) { // test if ns[i] can be the maximum for (int mask = 0; mask < (1 << m); ++mask) { LL bigsum = 0, smallsum = 0; for (int j = 0; j < m; ++j) { if (mask & (1 << j)) { bigsum += bigs[j]; } } int nleft = ns[i] - __builtin_popcount(mask); if (nleft < 0 || n - m < nleft) { continue; } for (int shift = 0; shift + nleft <= n - m; ++shift) { smallsum = prf[shift + nleft] - prf[shift]; if (goodmax(bigsum + smallsum)) { vector oth; for (int j = 0; j < shift; ++j) oth.push_back(x[j]); for (int j = shift+nleft; j < n - m; ++j) oth.push_back(x[j]); for (int j = 0; j < m; ++j) { if (!(mask & (1 << j))) { oth.push_back(bigs[j]); } } cout << "YES\n"; for (int j = 0; j < 3; ++j) { if (j != i) { for (int _ = 0; _ < ns[j]; ++_) { cout << oth.back() << " "; oth.pop_back(); } cout << "\n"; } else if (j == i) { for (int k = 0; k < m; ++k) { if (mask & (1 << k)) { cout << bigs[k] << " "; } } for (int k = shift; k < shift+nleft; ++k) { cout << x[k] << " "; } cout << "\n"; } } return; } } } } cout << "NO\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; while (t--) { solve(); } }