#include <bits/stdc++.h>
using namespace std;
bool dif[10];
int p[1005], n, x, y, ans1, ans2;
inline void chk(int p) {
  int i, sz = 0, res;
  for (i = 1; i <= n; i++) {
    if (i & (1 << p)) {
      sz++;
    }
  }
  if (sz == 0) {
    dif[p] = 0;
    return;
  }
  printf("? %d ", sz);
  for (i = 1; i <= n; i++) {
    if (i & (1 << p)) {
      printf("%d ", i);
    }
  }
  printf("\n");
  fflush(stdout);
  scanf("%d", &res);
  if (sz & 1) {
    if (res == x) {
      dif[p] = 0;
      return;
    }
    if (res == y) {
      dif[p] = 1;
      return;
    }
  } else {
    if (res == (x ^ y)) {
      dif[p] = 1;
      return;
    }
    if (res == 0) {
      dif[p] = 0;
      return;
    }
  }
}
inline bool ok(int pr) {
  int res, i;
  printf("? %d ", pr);
  for (i = 1; i <= pr; i++) {
    printf("%d ", p[i]);
  }
  printf("\n");
  fflush(stdout);
  scanf("%d", &res);
  if (pr & 1) {
    if (res == x) {
      return 0;
    }
    if (res == y) {
      return 1;
    }
  } else {
    if (res == (x ^ y)) {
      return 1;
    }
    if (res == 0) {
      return 0;
    }
  }
}
inline int get(int x) {
  int i, cnt = 0;
  for (i = 1; i <= n; i++) {
    if (!(i & (1 << x))) {
      continue;
    }
    p[++cnt] = i;
  }
  int l = 1, r = cnt;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (ok(mid)) {
      r = mid - 1;
    } else {
      l = mid + 1;
    }
  }
  return p[l];
}
int main() {
  int i;
  scanf("%d%d%d", &n, &x, &y);
  for (i = 9; i >= 0; i--) {
    chk(i);
  }
  for (i = 9; i >= 0; i--) {
    if (dif[i]) {
      ans1 = get(i);
      break;
    }
  }
  ans2 = ans1;
  for (i = 9; i >= 0; i--) {
    if (dif[i]) {
      ans2 ^= (1 << i);
    }
  }
  printf("! %d %d\n", ans2, ans1);
  fflush(stdout);
  return 0;
}
