#include <bits/stdc++.h>
using namespace std;
typedef bool (*check)(vector<long long> *, vector<long long> *, long long,
                      long long);
long long Ask(vector<long long> *S1, vector<long long> *S2, long long i,
              long long j) {
  long long size = (S2 == nullptr) ? 0 : S2->size();
  if (size == 0 && j - i < 2) return 0;
  cout << "? " << j - i + size << "\n";
  for (long long k = i; k < j; k++) cout << (*S1)[k] + 1 << " ";
  for (long long k = 0; k < size; k++) cout << (*S2)[k] + 1 << " ";
  cout << "\n";
  cout.flush();
  long long answer = 0;
  cin >> answer;
  if (answer == -1) exit(0);
  return answer;
}
long long Binary_Search(vector<long long> *S, vector<long long> *D,
                        check checker) {
  long long L = 0;
  long long R = S->size();
  long long middle = 0;
  while (R - L > 1) {
    middle = L + (R - L) / 2;
    if (checker(S, D, L, middle))
      R = middle;
    else
      L = middle;
  }
  return (*S)[L];
}
void Spanning_Build(long long v, vector<long long> *S, vector<long long> *pi,
                    bool set, vector<bool> *sets) {
  (*sets)[v] = set;
  for (long long i = 0; i < S->size(); i++) {
    if ((*S)[i] == v) {
      (*S)[i] = S->back();
      S->pop_back();
      break;
    }
  }
  vector<long long> D = vector<long long>(1);
  D[0] = v;
  while (!(S->empty()) &&
         (Ask(S, &D, 0, S->size()) != Ask(S, nullptr, 0, S->size()))) {
    long long w =
        Binary_Search(S, &D,
                      [](vector<long long> *S_i, vector<long long> *D_i,
                         long long i, long long j) -> bool {
                        return Ask(S_i, D_i, i, j) != Ask(S_i, nullptr, i, j);
                      });
    (*pi)[w] = v;
    Spanning_Build(w, S, pi, !set, sets);
  }
}
pair<long long, long long> Found_Edge(vector<long long> *B) {
  long long L = 0;
  long long R = B->size();
  long long middle = 0;
  while (R - L > 2) {
    middle = L + (R - L) / 2;
    if (Ask(B, nullptr, L, middle) != 0)
      R = middle;
    else if (Ask(B, nullptr, middle, R) != 0)
      L = middle;
    else {
      vector<long long> B_1 = vector<long long>();
      vector<long long> B_2 = vector<long long>();
      for (long long i = L; i < middle; i++) B_1.push_back((*B)[i]);
      for (long long i = middle; i < R; i++) B_2.push_back((*B)[i]);
      long long v = Binary_Search(
          &B_1, &B_2,
          [](vector<long long> *B_1i, vector<long long> *B_2i, long long i,
             long long j) { return Ask(B_1i, B_2i, i, j) != 0; });
      vector<long long> D = vector<long long>(1);
      D[0] = v;
      long long w = Binary_Search(
          &B_2, &D,
          [](vector<long long> *B_2i, vector<long long> *D_i, long long i,
             long long j) { return Ask(B_2i, D_i, i, j) != 0; });
      return {v, w};
    }
  }
  return {(*B)[L], (*B)[L + 1]};
}
void Odd_Cycle(pair<long long, long long> e, vector<long long> *pi) {
  vector<bool> mark = vector<bool>(pi->size());
  long long x = e.first;
  while (x != -1) {
    mark[x] = true;
    x = (*pi)[x];
  }
  x = e.second;
  while (!mark[x]) x = (*pi)[x];
  long long v = e.first;
  long long w = e.second;
  queue<long long> first_middle = queue<long long>();
  stack<long long> second_middle = stack<long long>();
  while (w != x) {
    first_middle.push(w);
    w = (*pi)[w];
  }
  first_middle.push(x);
  while (v != x) {
    second_middle.push(v);
    v = (*pi)[v];
  }
  cout << "N " << first_middle.size() + second_middle.size() << "\n";
  while (!first_middle.empty()) {
    cout << first_middle.front() + 1 << " ";
    first_middle.pop();
  }
  while (!second_middle.empty()) {
    cout << second_middle.top() + 1 << " ";
    second_middle.pop();
  }
  cout << "\n";
  cout.flush();
}
int main(int argc, char const *argv[]) {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  long long n = 0;
  cin >> n;
  vector<long long> V = vector<long long>(n);
  for (long long i = 0; i < n; i++) V[i] = i;
  vector<bool> sets = vector<bool>(n);
  vector<long long> pi = vector<long long>();
  pi.assign(n, -1);
  Spanning_Build(0, &V, &pi, 0, &sets);
  vector<long long> B = vector<long long>();
  vector<long long> N = vector<long long>();
  for (long long i = 0; i < sets.size(); i++) {
    if (sets[i] == 0)
      B.push_back(i);
    else
      N.push_back(i);
  }
  if (Ask(&B, nullptr, 0, B.size()) != 0) {
    pair<long long, long long> e = Found_Edge(&B);
    Odd_Cycle(e, &pi);
  } else if (Ask(&N, nullptr, 0, N.size()) != 0) {
    pair<long long, long long> e = Found_Edge(&N);
    Odd_Cycle(e, &pi);
  } else {
    cout << "Y " << B.size() << "\n";
    for (long long v : B) cout << v + 1 << " ";
    cout << "\n";
    cout.flush();
  }
  return 0;
}
