#include using namespace std; using ll = long long; using ld = long double; using pii = pair; using vi = vector; using vvi = vector; #define rep(i, a, b) for(ll i = (a); i < (b); i++) #define repb(i, a, b) for(ll i = (b) - 1; i >= (a); i--) #define all(x) begin(x),end(x) #define sz(x) (int)(x).size() struct Tree { typedef pii T; static constexpr T unit = make_pair(0, 0); T f(T a, T b) { return make_pair(a.first + b.first, a.second + b.second); } vector s; int n; Tree(int n, T def = unit) : s(2*n, def), n(n) {} void update(int pos, T val) { for (s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos * 2], s[pos * 2 + 1]); } T query(int b, int e) { T ra = unit, rb = unit; for(b += n, e += n; b < e; b/=2, e/=2) { if (b % 2) ra = f(ra, s[b++]); if (e % 2) rb = f(s[--e], rb); } return f(ra, rb); } int search(auto&& p, int l = 0) { if (p(query(l, n))) return 0; T val = unit; for(l += n; p(f(val, s[l])); l /= 2) if (l & 1) val = f(val, s[l++]); for (; l < n; l *= 2) if (p(f(val, s[l]))) val = f(val, s[l++]); return l - n + 1 + (bool)p(f(val, s[l])); } }; void solve() { ll n, na, nb, nc; cin >> n >> na >> nb >> nc; vi perm = {na, nb, nc}; vi x(n); rep(i, 0, n) cin >> x[i]; sort(all(x), greater()); ll sum = accumulate(all(x), 0ll); Tree t(n); ll num = 0; auto find = [&](pii val) { return val.second < num; }; sort(all(perm)); vector used; vector output; auto checkCount = [&](ll ct, vi& output) -> bool { num = ct; int r = t.search(find); if (t.query(0, r).first >= (sum + 1) / 2) return false; ll acc = 0; rep(i, 0, n) { if (!used[i] && ct > 0) { ll intermed = acc + x[i]; if (ct > 1) { num = ct - 1; int r = t.search(find); intermed += t.query(0, r).first; } if (intermed < (sum + 1) / 2) { output.push_back(x[i]); acc += x[i]; ct--; used[i] = true; t.update(n - i - 1, make_pair(0, 0)); } } } return true; }; bool found = false; do { rep(i, 0, n) t.update(n - i - 1, make_pair(x[i], 1)); used = vector(n, false); output = vector(3); if (checkCount(perm[0], output[0]) && checkCount(perm[1], output[1]) && checkCount(perm[2], output[2])) { cout << "YES" << endl; vector used2(3, false); for(auto ni : {na, nb, nc}) { rep(i, 0, 3) if (!used2[i] && sz(output[i]) == ni) { used2[i] = true; rep(ii, 0, ni) cout << output[i][ii] << " "; cout << endl; break; } } return; } } while (next_permutation(all(perm))); cout << "NO" << endl; } int main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); ll t; cin >> t; while(t--) solve(); }