#include //#pragma GCC optimize("O3") #define int long long 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() typedef long long ll; typedef pair pii; typedef vector vi; void solve(){ int n, na, nb, nc; cin >> n >> na >> nb >> nc; vector v(n); for(int &x : v) cin >> x; sort(all(v)); vector> ns = {{na,1},{nb,2},{nc,3}}; sort(ns.rbegin(),ns.rend()); int sum = 0; vector take(n); for(int x : v) sum += x; for(int i = 1; i <= 2; i++){ int cur = 0, low = 0, high = 0; for(int j = 0; j < ns[i-1].first; j++){ while(take[high]) high++; cur += v[high]; take[high] = i; } if(2*cur >= sum){ cout << "NO\n"; return; } while(high < n){ while(high < n && take[high]) high++; if(high >= n) break; while(low < high && (take[low] != i || 2*(cur-v[low]+v[high]) >= sum)) low++; if(low >= high) break; take[low] = 0; take[high] = i; cur += v[high]-v[low]; } } int rem = 0; for(int i = 0; i < n; i++) if(!take[i]) rem += v[i]; if(2*rem >= sum){ cout << "NO\n"; return; } cout << "YES\n"; for(int i = 1; i <= 3; i++){ for(int j = 0; j < 3; j++){ if(ns[j].second == i){ for(int k = 0; k < n; k++) if((j==2 && !take[k]) || (j<2 && take[k] == j+1)){ cout << v[k] << " "; } cout << "\n"; } } } } signed main(){ cin.tie(0); ios::sync_with_stdio(0); int t; cin >> t; while(t--) solve(); }