#include <bits/stdc++.h>
using namespace std;
long long bigmod(long long b, long long p) {
  if (p == 0) return 1;
  long long my = bigmod(b, p / 2);
  my *= my;
  my %= 1000000007;
  if (p & 1) my *= b, my %= 1000000007;
  return my;
}
int setb(int n, int pos) { return n = n | (1 << pos); }
int resb(int n, int pos) { return n = n & ~(1 << pos); }
bool checkb(int n, int pos) { return (bool)(n & (1 << pos)); }
int n;
struct info {
  int d, b, e;
  info() {}
  info(int _d, int _b, int _e) {
    d = _d;
    b = _b;
    e = _e;
  }
  bool operator<(const info &p) const {
    if (d == p.d) {
      if (b == p.b)
        return e < p.e;
      else
        return b < p.b;
    } else
      return d < p.d;
  }
};
vector<info> u, v;
int mx;
void F(int depth, int b, int e) {
  if (b >= e) return;
  mx = max(mx, depth);
  int mid = (b + e) / 2;
  u.push_back(info(depth, b, mid));
  v.push_back(info(depth, mid + 1, e));
  F(depth + 1, b, mid);
  F(depth + 1, mid + 1, e);
}
vector<int> q1[15], q2[15], ask1[15], ask2[15];
void process() {
  int len, i, j;
  len = u.size();
  for (i = 0; i < len; i++) {
    info my = u[i];
    for (j = my.b; j <= my.e; j++) {
      q1[my.d].push_back(j);
    }
  }
  len = v.size();
  for (i = 0; i < len; i++) {
    info my = v[i];
    for (j = my.b; j <= my.e; j++) {
      q2[my.d].push_back(j);
    }
  }
  for (i = 1; i <= mx; i++) {
    len = q1[i].size();
    int prv = -1;
    for (j = 0; j < len; j++) {
      if (q1[i][j] != prv) ask1[i].push_back(q1[i][j]);
      prv = q1[i][j];
    }
    sort(ask1[i].begin(), ask1[i].end());
  }
  for (i = 1; i <= mx; i++) {
    len = q2[i].size();
    int prv = -1;
    for (j = 0; j < len; j++) {
      if (q2[i][j] != prv) ask2[i].push_back(q2[i][j]);
      prv = q2[i][j];
    }
    sort(ask2[i].begin(), ask2[i].end());
  }
}
int lol[1005], upd[1005];
bool taken[1005];
void go(int depth, int f) {
  int i, x;
  memset(taken, 0, sizeof(taken));
  if (f == 0) {
    int len = ask1[depth].size(), i;
    for (i = 0; i < len; i++) {
      int my = ask1[depth][i];
      taken[my] = 1;
    }
  } else {
    int len = ask2[depth].size(), i;
    for (i = 0; i < len; i++) {
      int my = ask2[depth][i];
      taken[my] = 1;
    }
  }
  for (i = 1; i <= n; i++) {
    scanf("%d", &lol[i]);
    if (taken[i] == 0) {
      upd[i] = min(upd[i], lol[i]);
    }
  }
}
void ASK(int depth, int f) {
  if (f == 0) {
    int len = ask1[depth].size(), i;
    printf("%d\n", len);
    fflush(stdout);
    for (i = 0; i < len; i++) {
      if (i) {
        printf(" ");
        fflush(stdout);
      }
      printf("%d", ask1[depth][i]);
      fflush(stdout);
    }
    puts("");
    fflush(stdout);
  } else {
    int len = ask2[depth].size(), i;
    printf("%d\n", len);
    fflush(stdout);
    for (i = 0; i < len; i++) {
      if (i) {
        printf(" ");
        fflush(stdout);
      }
      printf("%d", ask2[depth][i]);
      fflush(stdout);
    }
    puts("");
    fflush(stdout);
  }
}
int main() {
  int i, j;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) upd[i] = 2000000000;
  F(1, 1, n);
  process();
  for (i = 1; i <= mx; i++) {
    for (j = 0; j < 2; j++) {
      ASK(i, j);
      go(i, j);
    }
  }
  puts("-1");
  fflush(stdout);
  for (i = 1; i <= n; i++) {
    if (i > 1) {
      printf(" ");
      fflush(stdout);
    }
    printf("%d", upd[i]);
    fflush(stdout);
  }
  puts("");
  fflush(stdout);
  return 0;
}
