#include using namespace std; using ll = long long; void solve(){ ll n, na, nb, nc; cin >> n >> na >> nb >> nc; vector val(3); val[0] = na, val[1] = nb, val[2] = nc; sort(val.begin(), val.end()); vector x(n); for (int i = 0; i < n; ++i) cin >> x[i]; sort(x.begin(), x.end()); vector> sets(3, multiset()); ll sa = 0, sb = 0, sc = 0; for (int i = 0; i < val[0] - 1; ++i){ sets[0].insert(x[i]); sa += x[i]; } sets[0].insert(x[n-1]); sa += x[n-1]; for (int i = val[0] - 1; i < val[0] + val[1] - 1; ++i){ sets[1].insert(x[i]); sb += x[i]; } for (int i = val[0] + val[1] - 1; i < n - 1; ++i){ sets[2].insert(x[i]); sc += x[i]; } if (sa >= sb + sc){ cout << "NO\n"; return; } //fix the sets. for (int i = 0; i < n; ++i){ if (sa + sb <= sc){ //*s.begin() //*s.rbegin() ll bv = *sets[1].begin(); ll cv = *sets[2].rbegin(); sets[1].erase(sets[1].begin()); sets[2].erase(sets[2].find(cv)); sets[1].insert(cv); sets[2].insert(bv); sc = sc - cv + bv; sb = sb - bv + cv; continue; } else if (sa + sc <= sb){ ll bv = *sets[1].rbegin(); ll cv = *sets[2].begin(); sets[1].erase(sets[1].find(bv)); sets[2].erase(sets[2].begin()); sets[1].insert(cv); sets[2].insert(bv); sc = sc - cv + bv; sb = sb - bv + cv; continue; } break; } if (sa + sb <= sc || sa + sc <= sb){ cout << "NO\n"; return; } //output; cout << "YES\n"; ll naind, nbind, ncind; if (na == val[0]) naind = 0; else if (na == val[1]) naind = 1; else naind = 2; if (nb == val[0] && naind != 0) nbind = 0; else if (nb == val[1] && naind != 1) nbind = 1; else nbind = 2; ncind = 3 - nbind - naind; for (ll a : sets[naind]) cout << a << " "; cout << "\n"; for (ll b : sets[nbind]) cout << b << " "; cout << "\n"; for (ll c : sets[ncind]) cout << c << " "; cout << "\n"; } int main(){ int t; cin >> t; while (t--) solve(); }