#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const U &b) {
  if (a < b) a = b;
}
template <class T>
inline void gn(T &first) {
  char c, sg = 0;
  while (c = getchar(), (c > '9' || c < '0') && c != '-')
    ;
  for ((c == '-' ? sg = 1, c = getchar() : 0), first = 0; c >= '0' && c <= '9';
       c = getchar())
    first = (first << 1) + (first << 3) + c - '0';
  if (sg) first = -first;
}
template <class T1, class T2>
inline void gn(T1 &x1, T2 &x2) {
  gn(x1), gn(x2);
}
int power(int a, int b, int m, int ans = 1) {
  for (; b; b >>= 1, a = 1LL * a * a % m)
    if (b & 1) ans = 1LL * ans * a % m;
  return ans;
}
int query(vector<int> a, vector<int> b, int v) {
  if (a.empty() || b.empty()) return 0;
  printf("%d\n", a.size());
  for (int u : a) printf("%d ", u);
  printf("\n%d\n", b.size());
  for (int u : b) printf("%d ", u);
  printf("\n%d\n", v);
  fflush(stdout);
  int ans;
  gn(ans);
  return ans;
}
vector<pair<int, int> > edge;
vector<pair<int, int> > vec;
int n, vst[510];
int sz[510];
void dfs(int p) {
  vst[p] = sz[vec[p].second] = 1;
  if (vec[p].second == 1) {
    for (int i = p + 1; i < n; i++)
      if (!vst[i]) {
        edge.push_back(pair<int, int>(1, vec[i].second));
        dfs(i);
      }
  } else {
    while (sz[vec[p].second] < vec[p].first) {
      int st = p, ed = n;
      while (ed - st > 1) {
        int mid = st + ed >> 1;
        vector<int> a;
        a.push_back(1);
        vector<int> b;
        for (int i = p + 1; i <= mid; i++)
          if (!vst[i]) b.push_back(vec[i].second);
        if (query(a, b, vec[p].second))
          ed = mid;
        else
          st = mid;
      }
      edge.push_back(pair<int, int>(vec[p].second, vec[ed].second));
      dfs(ed);
      sz[vec[p].second] += sz[vec[ed].second];
    }
  }
}
int main() {
  cin >> n;
  for (int i = 2; i <= n; i++) {
    vector<int> a;
    a.push_back(1);
    vector<int> b;
    for (int j = 2; j <= n; j++)
      if (i != j) b.push_back(j);
    int sz = query(a, b, i) + 1;
    vec.push_back(pair<int, int>(sz, i));
  }
  vec.push_back(pair<int, int>(n, 1));
  sort(vec.begin(), vec.end());
  reverse(vec.begin(), vec.end());
  dfs(0);
  puts("ANSWER");
  for (pair<int, int> e : edge) printf("%d %d\n", e.first, e.second);
  return 0;
}
