#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx")
using namespace std;
int a, b, c, d, n, m, k;
long long sq[1002];
bool uu[1002];
inline void sr(vector<int>& a) {
  sort(a.begin(), a.end(),
       [](const int& a, const int& b) { return sq[a] < sq[b]; });
}
int main() {
  srand(29756111 + time(0));
  scanf("%d", &n);
  int lf = 0, rt = rand() % n;
  while (!rt) rt = rand() % n;
  vector<int> up, down;
  for (int _n((n)-1), i(0); i <= _n; i++) {
    if (i == lf || i == rt) continue;
    printf("%d %d %d %d\n", 2, lf + 1, rt + 1, i + 1);
    fflush(stdout);
    scanf("%d", &a);
    if (a == 1) {
      up.push_back(i);
      uu[i] = 1;
    } else {
      down.push_back(i);
    }
    printf("%d %d %d %d\n", 1, lf + 1, rt + 1, i + 1);
    fflush(stdout);
    scanf("%I64d", &sq[i]);
  }
  int uv = -1, dv = -1;
  for (int _n(((int)((up).size())) - 1), i(0); i <= _n; i++) {
    int v = up[i];
    if (uv == -1 || sq[v] > sq[uv]) {
      uv = v;
    }
  }
  for (int _n(((int)((down).size())) - 1), i(0); i <= _n; i++) {
    int v = down[i];
    if (dv == -1 || sq[v] > sq[dv]) {
      dv = v;
    }
  }
  vector<int> lu, ru, ld, rd;
  for (int _n((n)-1), i(0); i <= _n; i++) {
    if (i == lf || i == rt || i == uv || i == dv) continue;
    if (uu[i]) {
      printf("%d %d %d %d\n", 2, lf + 1, uv + 1, i + 1);
      fflush(stdout);
      scanf("%d", &a);
      if (a == 1) {
        lu.push_back(i);
      } else {
        ru.push_back(i);
      }
    } else {
      printf("%d %d %d %d\n", 2, lf + 1, dv + 1, i + 1);
      fflush(stdout);
      scanf("%d", &a);
      if (a == 1) {
        rd.push_back(i);
      } else {
        ld.push_back(i);
      }
    }
  }
  sr(lu);
  sr(ru);
  sr(ld);
  sr(rd);
  vector<int> res;
  res.push_back(lf);
  for (int _n(((int)((ld).size())) - 1), i(0); i <= _n; i++)
    res.push_back(ld[i]);
  if (dv != -1) res.push_back(dv);
  for (int i = ((int)((rd).size()) - 1), _b = (0); i >= _b; i--)
    res.push_back(rd[i]);
  res.push_back(rt);
  for (int _n(((int)((ru).size())) - 1), i(0); i <= _n; i++)
    res.push_back(ru[i]);
  if (uv != -1) res.push_back(uv);
  for (int i = ((int)((lu).size()) - 1), _b = (0); i >= _b; i--)
    res.push_back(lu[i]);
  printf("0");
  for (int _n(((int)((res).size())) - 1), i(0); i <= _n; i++)
    printf(" %d", res[i] + 1);
  printf("\n");
  fflush(stdout);
}
