#include using namespace std; #define int long long #define double long double #define f first #define s second pair split(vector vect1, int ra) { int sum = 0; for(auto k : vect1) { sum += k; } int pos = -1; int maxsum = 0; int currsum = 0; for(int i = 0; i < ra; i++) { currsum += vect1[vect1.size() - i - 1]; } if (currsum <= (sum - 1) / 2) { pos = 0; maxsum = currsum; } for (int i = 0; i < ra; i++) { currsum -= vect1[vect1.size() - ra + i]; currsum += vect1[i]; if (currsum <= (sum - 1) / 2 && currsum > maxsum) { maxsum = currsum; pos = i + 1; } } return {pos, maxsum}; } bool can(int a, int b, int c) { vector arr = {a, b, c}; sort(arr.begin(), arr.end()); return arr[2] < arr[0] + arr[1]; } void find() { int n, a, b, c; cin >> n >> a >> b >> c; int x; vector vect1; for(int i = 0; i < n; i++){ cin >> x; vect1.push_back(x); } sort(vect1.begin(), vect1.end()); vector nums = {a, b, c}; vector order {0, 1, 2}; int sum = 0; for(auto k:vect1) { sum += k; } do { vector mapping(3); for(int i = 0; i < 3; i++) { mapping[order[i]] = nums[i]; } pair mainsplit = split(vect1, mapping[2]); if(mainsplit.f != -1) { vector vect2; for(int j = mainsplit.f; j < mainsplit.f + mapping[0] + mapping[1]; j++) { vect2.push_back(vect1[j]); } pair secondsplit = {0, 0}; for (int j = 0; j < mapping[1]; j++) { secondsplit.s += vect2[vect2.size() - j - 1]; } if(can(mainsplit.s, secondsplit.s, sum - mainsplit.s - secondsplit.s)) { vector > ans(3); for (int i = 0; i < mainsplit.f; i++) { ans[2].push_back(vect1[i]); } for(int i = 0; i < mapping[2] - mainsplit.f; i++) { ans[2].push_back(vect1[vect1.size() - i - 1]); } for (int i = 0; i < secondsplit.f; i++) { ans[1].push_back(vect2[i]); } for(int i = 0; i < mapping[1] - secondsplit.f; i++) { ans[1].push_back(vect2[vect2.size() - i - 1]); } for (int i = secondsplit.f; i < vect2.size() - (mapping[1] - secondsplit.f); i++) { ans[0].push_back(vect2[i]); } vector > ans2(3); ans2[0] = ans[order[0]]; ans2[1] = ans[order[1]]; ans2[2] = ans[order[2]]; cout << "YES\n"; for(auto k:ans2) { for(auto j : k) { cout << j << " "; } cout << "\n"; } goto cont; } for (int j = 0; j < mapping[1]; j++) { secondsplit.s -= vect2[vect2.size() - mapping[1] + j]; secondsplit.s += vect2[j]; secondsplit.f = j + 1; if (can(mainsplit.s, secondsplit.s, sum - mainsplit.s - secondsplit.s)) { vector > ans(3); for (int i = 0; i < mainsplit.f; i++) { ans[2].push_back(vect1[i]); } for (int i = 0; i < mapping[2] - mainsplit.f; i++) { ans[2].push_back(vect1[vect1.size() - i - 1]); } for (int i = 0; i < secondsplit.f; i++) { ans[1].push_back(vect2[i]); } for (int i = 0; i < mapping[1] - secondsplit.f; i++) { ans[1].push_back(vect2[vect2.size() - i - 1]); } for (int i = secondsplit.f; i < vect2.size() - (mapping[1] - secondsplit.f); i++) { ans[0].push_back(vect2[i]); } vector > ans2(3); ans2[0] = ans[order[0]]; ans2[1] = ans[order[1]]; ans2[2] = ans[order[2]]; cout << "YES\n"; for (auto k: ans2) { for (auto j: k) { cout << j << " "; } cout << "\n"; } goto cont; } } } } while(next_permutation(order.begin(), order.end())); cout << "NO\n"; cont : ; } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; cin >> t; while (t--) { find(); } return 0; }