#include "scales.h"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
random_device rd;
mt19937 f(rd());
void init(int t) {}
int getNextLightest(int a, int b, int c, int d) {
cout << "NL\n";
bool lock_in = false;
for (int i = 0; i < 6; i++) {
if (corr[i] == d) {
lock_in = true;
}
if (corr[i] == a || corr[i] == b || corr[i] == c) {
if (lock_in) return corr[i];
}
}
for (int i = 0; i < 6; i++) {
if (corr[i] == a || corr[i] == b || corr[i] == c)
return corr[i];
}
return -1;
}
int hypothetic(const vector<int>& coins, vector<int> qu) { // let's say, hypothetically for the sake of argument, ...
bool lock_in = false;
int cnt = 0;
for (int x : coins) {
if (x == qu[0] || x == qu[1] || x == qu[2]) {
int pos = x == qu[0] ? 0 : x == qu[1] ? 1 : 2;
if (lock_in) return pos;
cnt++;
if (cnt == -qu[3])
return pos;
}
if (x == qu[3])
lock_in = true;
}
for (int x : coins) {
if (x == qu[0] || x == qu[1] || x == qu[2]) {
int pos = x == qu[0] ? 0 : x == qu[1] ? 1 : 2;
return pos;
}
}
return 0;
}
array<vector<vector<int>>, 3> categorize(vector<vector<int>> cand, vector<int> query) {
array<vector<vector<int>>, 3> cat;
for (auto coins : cand) {
cat[hypothetic(coins, query)].push_back(coins);
}
return cat;
}
int make_query(vector<int> qu) {
int res =
qu[3] == -1 ? getLightest(qu[0], qu[1], qu[2]) :
qu[3] == -2 ? getMedian(qu[0], qu[1], qu[2]) :
qu[3] == -3 ? getHeaviest(qu[0], qu[1], qu[2]) :
getNextLightest(qu[0], qu[1], qu[2], qu[3]);
cout<<qu[0]<<qu[1]<<qu[2]<<qu[3]<<' '<<res<<endl;
return res == qu[0] ? 0 : res == qu[1] ? 1 : 2;
}
void orderCoins() {
vector<vector<int>> queries;
for (int a = 1; a <= 6; a++) {
for (int b = 1; b <= 6; b++) {
for (int c = 1; c <= 6; c++) {
if (set<int>{a, b, c}.size() == 3) {
for (int r = -3; r <= -1; r++)
queries.push_back({a, b, c, r});
for (int d = 1; d <= 6; d++) {
if (a == d || b == d || c == d) continue;
queries.push_back({a, b, c, d});
}
}
}
}
}
shuffle(queries.begin(), queries.end(), f);
vector<vector<int>> cand;
vector<int> coins = {1, 2, 3, 4, 5, 6};
do {
cand.push_back(coins);
} while (next_permutation(coins.begin(), coins.end()));
while (cand.size() > 1) {
int n = cand.size();
for (auto qu : queries) {
auto cat = categorize(cand, qu);
int A = cat[0].size();
int B = cat[1].size();
int C = cat[2].size();
assert(A + B + C == n);
if (max({A, B, C}) <= min(n-1, (n+4)/5*2)) {
int x = make_query(qu);
cand = cat[x];
break;
}
}
}
int ans[6];
for (int i = 0;i < 6; i++)
ans[i] = cand[0][i];
answer(ans);
}