#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
int ans[MAXN + 10];
bool vis[MAXN + 10][MAXN + 10];
int main() {
  memset(ans, 0x3f, sizeof ans);
  int n;
  scanf("%d", &n);
  vis[n][n + 1] = true;
  while (true) {
    int pre = 0;
    bool has = false;
    vector<int> vec;
    vector<int> vail;
    for (int i = 1; i <= n; i++) {
      if (vis[i][i + 1]) {
        int len = i - pre - 1;
        if (len) {
          has = true;
          len = (len + 1) / 2;
          int midrow = pre + len;
          for (int j = midrow + 1; j <= n && !vis[midrow][j]; j++) {
            vec.push_back(j);
            vis[midrow][j] = true;
          }
          vis[midrow][midrow + 1] = false;
          for (int j = midrow; j >= 1 && !vis[j][midrow + 1]; j--) {
            vis[j][midrow + 1] = true;
            vail.push_back(j);
          }
        }
        pre = i;
      }
    }
    if (!has) break;
    sort(vec.begin(), vec.end());
    sort(vail.begin(), vail.end());
    printf("%d\n", vec.size());
    fflush(stdout);
    for (int i = 1; i <= (int)vec.size(); i++)
      printf("%d%c", vec[i - 1], i == (int)vec.size() ? '\n' : ' ');
    fflush(stdout);
    int u = 0, tmp;
    for (int i = 1; i <= n; i++) {
      scanf("%d", &tmp);
      if (u == vail.size()) continue;
      if (vail[u] != i) continue;
      ans[vail[u]] = min(ans[vail[u]], tmp);
      u++;
    }
    printf("%d\n", vail.size());
    fflush(stdout);
    for (int i = 1; i <= (int)vail.size(); i++)
      printf("%d%c", vail[i - 1], i == (int)vail.size() ? '\n' : ' ');
    fflush(stdout);
    u = 0;
    for (int i = 1; i <= n; i++) {
      scanf("%d", &tmp);
      if (u == vec.size()) continue;
      if (vec[u] != i) continue;
      ans[vec[u]] = min(ans[vec[u]], tmp);
      u++;
    }
  }
  printf("-1\n");
  fflush(stdout);
  for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
  return 0;
}
