#include <bits/stdc++.h>
int N, size[501], found[501];
std::vector<std::pair<int, int> > edge_list;
std::vector<int> E[501];
int del[501], dsize[501], mxson[501], q[501], fa[501];
int Sanho(int p) {
  int H = 0, T = 1;
  q[1] = p;
  fa[p] = 0;
  while (H < T) {
    int u = q[++H];
    for (int v : E[u])
      if (del[v] == 0 && v != fa[u]) fa[q[++T] = v] = u;
  }
  for (int i = 1; i <= T; i++) {
    dsize[q[i]] = 1;
    mxson[q[i]] = 0;
  }
  for (int i = T; i; i--) {
    if (dsize[q[i]] << 1 >= T && mxson[q[i]] << 1 <= T) return q[i];
    mxson[fa[q[i]]] = std::max(mxson[fa[q[i]]], mxson[q[i]]);
    dsize[fa[q[i]]] += dsize[q[i]];
  }
  return 0;
}
std::pair<int, int> subtree[501];
int sum[501];
int NiroBC(int p, int to_find) {
  p = Sanho(p);
  del[p] = 1;
  int G = 0;
  for (int v : E[p])
    if (!del[v]) {
      int H = 0, T = 1;
      q[1] = v;
      fa[v] = p;
      while (H < T) {
        int u = q[++H];
        for (int v : E[u])
          if (!del[v] && v != fa[u]) fa[q[++T] = v] = u;
      }
      subtree[++G] = {T, v};
    }
  std::sort(subtree + 1, subtree + G + 1);
  for (int i = 1; i <= G; i++) sum[i] = sum[i - 1] + subtree[i].first;
  int l = 1, r = G;
  while (l < r) {
    int m = l;
    for (int j = l + 1; j < r; j++)
      if (std::max(sum[r] - sum[j], sum[j] - sum[l - 1]) <
          std::max(sum[r] - sum[m], sum[m] - sum[l - 1]))
        m = j;
    printf("%d\n", m - l + 1);
    for (int j = l; j <= m; j++)
      printf("%d%c", subtree[j].second, " \n"[j == m]);
    printf("1\n%d\n%d\n", to_find, p);
    fflush(stdout);
    int answer;
    scanf("%d", &answer);
    if (answer == m - l + 1)
      l = m + 1;
    else
      r = m;
  }
  if (l > r)
    return p;
  else {
    printf("1\n%d\n1\n%d\n%d\n", subtree[l].second, to_find, p);
    fflush(stdout);
    int answer;
    scanf("%d", &answer);
    if (answer == 1)
      return p;
    else
      return NiroBC(subtree[l].second, to_find);
  }
}
int main() {
  scanf("%d", &N);
  size[1] = N;
  for (int i = 2; i <= N; i++) {
    printf("1\n1\n%d\n", N - 1);
    for (int j = 2; j <= N; j++) printf("%d%c", j, " \n"[j == N]);
    printf("%d\n", i);
    fflush(stdout);
    scanf("%d", size + i);
  }
  found[1] = 1;
  for (int _ = N - 1; _--;) {
    int max_not_found = 0;
    for (int j = 1; j <= N; j++)
      if (!found[j] && size[j] > size[max_not_found]) max_not_found = j;
    for (int j = 1; j <= N; j++)
      if (found[j]) del[j] = 0;
    int nearest = NiroBC(1, max_not_found);
    E[nearest].push_back(max_not_found);
    E[max_not_found].push_back(nearest);
    found[max_not_found] = 1;
    edge_list.push_back({nearest, max_not_found});
  }
  puts("ANSWER");
  for (auto i : edge_list) printf("%d %d\n", i.first, i.second);
  fflush(stdout);
  return 0;
}
