#include <bits/stdc++.h>
using namespace std;
const double pi = acos(0.0) * 2.0;
const long double eps = 1e-10;
const int step[8][2] = {{-1, 0}, {0, 1}, {1, 0},  {0, -1},
                        {-1, 1}, {1, 1}, {1, -1}, {-1, -1}};
template <class T>
inline T abs1(T a) {
  return a < 0 ? -a : a;
}
template <typename t, typename t1>
t min1(t a, t1 b) {
  return a < b ? a : b;
}
template <typename t, typename... arg>
t min1(t a, arg... arr) {
  return min1(a, min1(arr...));
}
template <typename t, typename t1>
t max1(t a, t1 b) {
  return a > b ? a : b;
}
template <typename t, typename... arg>
t max1(t a, arg... arr) {
  return max1(a, max1(arr...));
}
inline int jud(double a, double b) {
  if (abs(a) < eps && abs(b) < eps)
    return 0;
  else if (abs1(a - b) / max(abs1(a), abs1(b)) < eps)
    return 0;
  if (a < b) return -1;
  return 1;
}
template <typename t>
inline int jud(t a, t b) {
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}
template <typename it, typename t1>
inline int find(t1 val, it a, int na, bool f_small = 1, bool f_lb = 1) {
  if (na == 0) return 0;
  int be = 0, en = na - 1;
  if (*a <= *(a + na - 1)) {
    if (f_lb == 0)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != 1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != -1)
          en = mid;
        else
          be = mid + 1;
      }
    if (f_small && jud(*(a + be), val) == 1) be--;
    if (!f_small && jud(*(a + be), val) == -1) be++;
  } else {
    if (f_lb)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != -1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != 1)
          en = mid;
        else
          be = mid + 1;
      }
    if (!f_small && jud(*(a + be), val) == -1) be--;
    if (f_small && jud(*(a + be), val) == 1) be++;
  }
  return be;
}
template <class T>
inline T lowb(T num) {
  return num & (-num);
}
inline int bitnum(unsigned int nValue) { return __builtin_popcount(nValue); }
inline int bitnum(int nValue) { return __builtin_popcount(nValue); }
inline int bitnum(unsigned long long nValue) {
  return __builtin_popcount(nValue) + __builtin_popcount(nValue >> 32);
}
inline int bitnum(long long nValue) {
  return __builtin_popcount(nValue) + __builtin_popcount(nValue >> 32);
}
inline int bitmaxl(unsigned int a) {
  if (a == 0) return 0;
  return 32 - __builtin_clz(a);
}
inline int bitmaxl(int a) {
  if (a == 0) return 0;
  return 32 - __builtin_clz(a);
}
inline int bitmaxl(unsigned long long a) {
  int temp = a >> 32;
  if (temp) return 32 - __builtin_clz(temp) + 32;
  return bitmaxl(int(a));
}
inline int bitmaxl(long long a) {
  int temp = a >> 32;
  if (temp) return 32 - __builtin_clz(temp) + 32;
  return bitmaxl(int(a));
}
long long pow(long long n, long long m, long long mod = 0) {
  if (m < 0) return 0;
  long long ans = 1;
  long long k = n;
  while (m) {
    if (m & 1) {
      ans *= k;
      if (mod) ans %= mod;
    }
    k *= k;
    if (mod) k %= mod;
    m >>= 1;
  }
  return ans;
}
template <class t1, class t2>
inline void add(t1 &a, t2 b, int mod = -1) {
  if (mod == -1) mod = 1000000007;
  a += b;
  while (a >= mod) a -= mod;
  while (a < 0) a += mod;
}
template <class t>
void output1(t arr) {
  for (int i = 0; i < (int)arr.size(); i++) cerr << arr[i] << ' ';
  cerr << endl;
}
template <class t>
void output2(t arr) {
  for (int i = 0; i < (int)arr.size(); i++) output1(arr[i]);
}
const int maxn = 610;
int fa[maxn], cate[maxn];
int CheckOneNode(int no, vector<int> others) {
  printf("? %d\n", 1 + (int)others.size());
  for (int i = 0; i < (int)others.size(); i++) {
    printf("%d ", others[i]);
  }
  printf("%d\n", no);
  fflush(stdout);
  int cnt;
  scanf("%d", &cnt);
  int rcnt = 0;
  if (others.size() > 1 && cnt > 0) {
    printf("? %d\n", (int)others.size());
    for (int i = 0; i < (int)others.size(); i++) {
      printf("%d ", others[i]);
    }
    fflush(stdout);
    scanf("%d", &rcnt);
  }
  return cnt - rcnt;
}
int FindOneEdge(int no, vector<int> others) {
  if (others.size() == 0) {
    return -1;
  }
  if (CheckOneNode(no, vector<int>(others.begin(),
                                   others.begin() + (others.size() + 1) / 2))) {
    if (((int)others.size() + 1) / 2 == 1) {
      return others[0];
    }
    return FindOneEdge(
        no, vector<int>(others.begin(),
                        others.begin() + ((int)others.size() + 1) / 2));
  } else {
    return FindOneEdge(
        no, vector<int>(others.begin() + ((int)others.size() + 1) / 2,
                        others.end()));
  }
}
void CheckCircle(vector<int> &all) {
  int no = *all.rbegin();
  int rno =
      CheckOneNode(no, vector<int>(all.begin(), all.begin() + all.size() - 1));
  if (rno > 0) {
    rno =
        FindOneEdge(no, vector<int>(all.begin(), all.begin() + all.size() - 1));
    for (int j = 0; j < (int)all.size(); j++)
      if (rno == all[j]) {
        vector<int> fa1, fa2;
        while (no != -1) {
          fa1.push_back(no);
          no = fa[no];
        }
        while (rno != -1) {
          fa2.push_back(rno);
          rno = fa[rno];
        }
        for (int i = 0; i < (int)fa1.size(); i++)
          for (int j = 0; j < (int)fa2.size(); j++)
            if (fa1[i] == fa2[j]) {
              printf("N %d\n", (int)i + j + 1);
              for (int k = 0; k < i; k++) {
                printf("%d ", fa1[k]);
              }
              for (int k = j; k >= 0; k--) {
                printf("%d ", fa2[k]);
              }
              puts("");
              fflush(stdout);
              exit(0);
            }
      }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  int n;
  scanf("%d", &n);
  vector<int> all;
  for (int i = 1; i <= n; i++) all.push_back(i);
  memset(fa, -1, sizeof(fa));
  vector<int> ans[2];
  while (all.size()) {
    ans[0].push_back(*all.rbegin());
    cate[*all.rbegin()] = 0;
    int q[maxn], lq = 0;
    q[lq++] = *all.rbegin();
    all.pop_back();
    for (int i = 0; i < lq; i++) {
      int no = q[i], c = cate[no];
      int nxt;
      while ((nxt = FindOneEdge(no, all)) != -1) {
        ans[1 - c].push_back(nxt);
        cate[nxt] = 1 - c;
        fa[nxt] = no;
        q[lq++] = nxt;
        for (int i = 0; i < (int)all.size(); i++)
          if (all[i] == nxt) {
            all.erase(all.begin() + i);
            break;
          }
        CheckCircle(ans[1 - c]);
      }
    }
  }
  printf("Y %d\n", (int)ans[0].size());
  for (auto no : ans[0]) {
    printf("%d ", no);
  }
  puts("");
  fflush(stdout);
  return 0;
}
