#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T mod_v(T num) {
  if (num >= 0)
    return num % 1000000007;
  else
    return (num % 1000000007 + 1000000007) % 1000000007;
}
template <class T>
inline T gcd(T a, T b) {
  a = abs(a);
  b = abs(b);
  while (b) b ^= a ^= b ^= a %= b;
  return a;
}
template <class T>
T fast_pow(T n, T p) {
  if (p == 0) return 1;
  if (p % 2) {
    T g = mod_v(mod_v(n) * mod_v(fast_pow(n, p - 1)));
    return g;
  } else {
    T g = fast_pow(n, p / 2);
    g = mod_v(mod_v(g) * mod_v(g));
    return g;
  }
}
template <class T>
inline T modInverse(T n) {
  return fast_pow(n, 1000000007 - 2);
}
bool equalTo(double a, double b) {
  if (fabs(a - b) <= 1e-9)
    return true;
  else
    return false;
}
bool notEqual(double a, double b) {
  if (fabs(a - b) > 1e-9)
    return true;
  else
    return false;
}
bool lessThan(double a, double b) {
  if (a + 1e-9 < b)
    return true;
  else
    return false;
}
bool lessThanEqual(double a, double b) {
  if (a < b + 1e-9)
    return true;
  else
    return false;
}
bool greaterThan(double a, double b) {
  if (a > b + 1e-9)
    return true;
  else
    return false;
}
bool greaterThanEqual(double a, double b) {
  if (a + 1e-9 > b)
    return true;
  else
    return false;
}
template <class T>
inline int in(register T& num) {
  register char c = 0;
  num = 0;
  bool n = false;
  while (c < 33) c = getchar();
  while (c > 33) {
    if (c == '-')
      n = true;
    else
      num = num * 10 + c - '0';
    c = getchar();
  }
  num = n ? -num : num;
  return 1;
}
int n;
int matrx[1005][1005];
vector<int> lst[2];
int ara[1004];
int mark[1005];
void go(int x) {
  for (int len = 1; len <= n; len *= 2) {
    lst[0].clear();
    lst[1].clear();
    for (int i = 0; i < n; i++) {
      if ((i / len) % 2 == 1) {
        mark[i + 1] = 1;
        lst[1].push_back(i + 1);
      } else {
        lst[0].push_back(i + 1);
        mark[i + 1] = 2;
      }
    }
    if (((int)lst[0].size())) {
      printf("%d\n", ((int)lst[0].size()));
      for (int i : lst[0]) {
        printf("%d ", i);
      }
      printf("\n");
      fflush(stdout);
      for (int i = 1; i <= n; i++) in(ara[i]);
      for (int i = 1; i <= n; i++) {
        if (mark[i] == 2) continue;
        for (int j : lst[0]) {
          matrx[i][j] = min(matrx[i][j], ara[i]);
        }
      }
    }
    if (((int)lst[1].size())) {
      printf("%d\n", ((int)lst[1].size()));
      for (int i : lst[1]) {
        printf("%d ", i);
      }
      printf("\n");
      fflush(stdout);
      for (int i = 1; i <= n; i++) in(ara[i]);
      for (int i = 1; i <= n; i++) {
        if (mark[i] == 1) continue;
        for (int j : lst[1]) {
          matrx[i][j] = min(matrx[i][j], ara[i]);
        }
      }
    }
  }
}
int main() {
  in(n);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j)
        matrx[i][j] = 0;
      else
        matrx[i][j] = 1 << 30;
    }
  }
  go(n);
  printf("-1\n");
  for (int i = 1; i <= n; i++) {
    int tmp = 1 << 30;
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      tmp = min(tmp, matrx[i][j]);
    }
    printf("%d ", tmp);
  }
  return 0;
}
