#include <bits/stdc++.h>
using namespace std;
const int NMax = 605;
int N, Set[NMax], Left[NMax], Right[NMax], Step[NMax];
int Use[NMax];
vector<int> V[3];
vector<int> Res;
bool found;
int color;
int ask() {
  printf("? %d\n", Set[0]);
  for (int i = 1; i <= Set[0]; i++) printf("%d ", Set[i]);
  printf("\n");
  fflush(stdout);
  int ans;
  scanf("%d", &ans);
  return ans;
}
void fillSetboth(int left, int right) {
  Set[0] = 0;
  for (int i = 1; i <= Left[0]; i++) {
    Set[++Set[0]] = Left[i];
  }
  for (int i = left; i <= right; i++) {
    Set[++Set[0]] = Right[i];
  }
}
void fillSetRight(int left, int right) {
  Set[0] = 0;
  for (int i = left; i <= right; i++) {
    Set[++Set[0]] = Right[i];
  }
}
void fillSetV(int ind) {
  Set[0] = 0;
  for (int i = 0; i < V[ind].size(); i++) Set[++Set[0]] = V[ind][i];
}
void Query(int L, int R, int total) {
  if (L == R) {
    Res.push_back(Right[L]);
    return;
  }
  int Mid = (L + R) / 2;
  fillSetboth(L, Mid);
  int both = ask();
  fillSetRight(L, Mid);
  int r = ask();
  int between = both - r;
  if (between == total) {
    Query(L, Mid, total);
    return;
  }
  if (between == 0) {
    Query(Mid + 1, R, total);
    return;
  }
  Query(L, Mid, between);
  Query(Mid + 1, R, total - between);
}
void findCycle(int step, int color) {
  vector<int> Path1, Path2;
  fillSetV(color);
  int total = ask(), start = 0, fin = 0;
  for (int i = 0; i < V[color].size(); i++) {
    int node = V[color][i];
    Set[0] = 0;
    for (int j = 0; j < V[color].size(); j++) {
      if (i != j) Set[++Set[0]] = V[color][j];
    }
    int ans = total - ask();
    if (ans != 0) {
      start = node;
      break;
    }
  }
  for (int i = 0; i < V[color].size(); i++) {
    int node = V[color][i];
    if (node == start) continue;
    Set[0] = 0;
    Set[++Set[0]] = node;
    Set[++Set[0]] = start;
    if (ask() == 1) {
      fin = node;
      break;
    }
  }
  int c = 3 - color, last = start;
  Path1.push_back(start);
  step = Step[start];
  for (int stp = step - 1; stp >= 1; stp--, c = 3 - c) {
    for (int i = 0; i < V[c].size(); i++) {
      int node = V[c][i];
      if (Step[node] == stp) {
        Set[0] = 0;
        Set[++Set[0]] = node;
        Set[++Set[0]] = last;
        if (ask() == 1) {
          Path1.push_back(node);
          last = node;
          break;
        }
      }
    }
  }
  c = 3 - color;
  last = fin;
  step = Step[fin];
  Path2.push_back(fin);
  for (int stp = step - 1; stp >= 1; stp--, c = 3 - c) {
    for (int i = 0; i < V[c].size(); i++) {
      int node = V[c][i];
      if (Step[node] == stp) {
        Set[0] = 0;
        Set[++Set[0]] = node;
        Set[++Set[0]] = last;
        if (ask() == 1) {
          Path2.push_back(node);
          last = node;
          break;
        }
      }
    }
  }
  reverse(Path1.begin(), Path1.end());
  reverse(Path2.begin(), Path2.end());
  int pos = 0;
  for (int i = 0; i < min(Path1.size(), Path2.size()); i++) {
    if (Path1[i] != Path2[i]) {
      break;
    }
    pos = i;
  }
  printf("N ");
  printf("%d\n", Path1.size() - pos - 1 + Path2.size() - pos - 1 + 1);
  for (int i = pos + 1; i < Path1.size(); i++) printf("%d ", Path1[i]);
  for (int i = Path2.size() - 1; i >= pos; i--) printf("%d ", Path2[i]);
  printf("\n");
}
void DFS(int start) {
  V[2].clear();
  V[1].clear();
  Left[0] = Right[0] = 0;
  Use[start] = 1;
  Step[start] = 1;
  V[1].push_back(start);
  Set[0] = 0;
  Left[++Left[0]] = start;
  for (int i = 1; i <= N; i++)
    if (Use[i] == 0) Right[++Right[0]] = i;
  color = 2;
  int step = 1;
  while (Right[0] > 0) {
    ++step;
    Res.clear();
    fillSetboth(1, Right[0]);
    int both = ask();
    fillSetRight(1, Right[0]);
    int r = ask();
    if (r == both) return;
    Query(1, Right[0], both - r);
    for (int i = 0; i < Res.size(); i++) {
      Use[Res[i]] = color;
      V[color].push_back(Res[i]);
      Step[Res[i]] = step;
    }
    fillSetV(color);
    if (ask() != 0) {
      findCycle(step, color);
      found = 1;
      return;
    }
    Left[0] = 0;
    for (int i = 1; i <= Right[0]; i++)
      if (Use[Right[i]] != 0) Left[++Left[0]] = Right[i];
    Right[0] = 0;
    for (int i = 1; i <= N; i++)
      if (Use[i] == 0) Right[++Right[0]] = i;
    if (Right[0] == 0) return;
    color = 3 - color;
  }
}
void Solve() {
  for (int i = 1; i <= N && !found; i++) {
    if (Use[i] == 0) DFS(i);
  }
  if (found) return;
  printf("Y ");
  int cnt = 0;
  for (int i = 1; i <= N; i++)
    if (Use[i] == 1) ++cnt;
  printf("%d\n", cnt);
  for (int i = 1; i <= N; i++)
    if (Use[i] == 1) printf("%d ", i);
  printf("\n");
}
int main() {
  scanf("%d", &N);
  Solve();
  return 0;
}
