#include <bits/stdc++.h>
using namespace std;
int X[] = {-2, 3, -2, 1, 0, 2};
int Y[] = {1, -1, -1, -2, 3, 2};
int64_t ask_area(int i, int j, int k) {
  cout << 1 << " " << i + 1 << " " << j + 1 << " " << k + 1 << endl;
  int64_t A;
  cin >> A;
  return A;
}
int ask_sign(int i, int j, int k) {
  cout << 2 << " " << i + 1 << " " << j + 1 << " " << k + 1 << endl;
  int a;
  cin >> a;
  return a == 1;
}
int main() {
  int N;
  cin >> N;
  vector<int> S1(N), S2(N);
  vector<int> vs[2];
  vector<int64_t> A(N);
  for (int i = 2; i < N; i++) {
    S1[i] = ask_sign(0, 1, i);
    vs[S1[i]].push_back(i);
    A[i] = ask_area(0, 1, i);
  }
  int x = 0, y = 1;
  for (int a : vs[1])
    if (A[a] > A[x]) x = a;
  for (int a : vs[0])
    if (A[a] > A[y]) y = a;
  cerr << x + 1 << y + 1 << endl;
  for (int a : vs[0]) cerr << a + 1;
  cerr << endl;
  for (int a : vs[1]) cerr << a + 1;
  cerr << endl;
  vector<int> vvs[4];
  int O[2][2];
  O[1][0] = 0;
  O[1][1] = 1;
  O[0][1] = 2;
  O[0][0] = 3;
  for (int i = 2; i < N; i++)
    if (i != x && i != y) {
      S2[i] = ask_sign(x, y, i);
      int o = O[S1[i]][S2[i]];
      vvs[o].push_back(i);
    }
  for (int i = 0; i < 4; i++)
    sort(vvs[i].begin(), vvs[i].end(),
         [&](int a, int b) { return A[a] < A[b]; });
  for (int i : {1, 3}) reverse(vvs[i].begin(), vvs[i].end());
  vector<int> ans;
  ans.push_back(0);
  for (int a : vvs[0]) ans.push_back(a);
  if (x != 0) ans.push_back(x);
  for (int a : vvs[1]) ans.push_back(a);
  ans.push_back(1);
  for (int a : vvs[2]) ans.push_back(a);
  if (y != 1) ans.push_back(y);
  for (int a : vvs[3]) ans.push_back(a);
  reverse(ans.begin(), ans.end());
  rotate(ans.begin(), ans.begin() + N - 1, ans.end());
  cout << 0;
  for (int a : ans) cout << " " << a + 1;
  cout << endl;
  return 0;
}
