#include using namespace std; #define rep(i,a,b) for (int i = (a); i < (b);++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() #define fo(i, n) for(int i=0;i<(n);i++) typedef long long ll; typedef pair pii; typedef vector vi; const int NMAX = 212345; ll in[NMAX]; multiset elems[3]; ll sums[3]; ll ts; void INS(int i, ll val) { sums[i]+=val; elems[i].insert(val); } void task() { fo(i,3) sums[i]=0; fo(i,3) elems[i].clear(); ts = 0; int n; int nn[3]; scanf("%d%d%d%d", &n, nn, nn+1, nn+2); fo(i,n) scanf("%lld", in+i); fo(i,n) ts+=in[i]; sort(in, in+n); int minnn = n, minind; fo(i,3) minnn = min(minnn, nn[i]); fo(i,3) if(minnn == nn[i]) { sums[i]+= in[n-1]; minind = i; break; } fo(i,n-1) { fo(j,3) if(elems[j].size() + (j==minind) < nn[j]) { INS(j, in[i]); break; } } fo(ss, 3*n) { bool ch=false; fo(i,3) if(2*sums[i]>=ts) { ch = true; int j = (i +1+ rand()%2)%3; if(elems[i].size() && elems[j].size()) { auto it = elems[i].end(); it--; ll val = *it; elems[i].erase(it); sums[i]-=val; auto jt = elems[j].begin(); ll val2 = *jt; elems[j].erase(jt); sums[j]-=val2; INS(j, val); INS(i, val); } } if(!ch) { elems[minind].insert(in[n-1]); printf("YES"); fo(i,3){ int j=0; for(ll v: elems[i]) printf("%c%lld", j++?' ':'\n', v); } printf("\n"); return; } } printf("NO\n"); } signed main() { srand(0); int t; scanf("%d", &t); while(t-->0) task(); return 0; }