#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const long long INFLL = 1e18 + 1;
const int MAX = 200001;
const long long MOD = 1000000007;
const int SZ = 300100;
const double PI = 3.14159265358979323846264338327;
long long inq(long long k, long long q, long long mod) {
  if (q == 0) return 1;
  long long l = inq(k, q / 2, mod);
  if (q % 2 == 0)
    return l * l % mod;
  else
    return l * l % mod * k % mod;
}
long long gcd(long long a, long long b) {
  if (a < b) swap(a, b);
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long cubr(long long a) {
  long long l = -1, r = 1e6 + 2;
  while (l < r - 1) {
    long long mid = (l + r) / 2;
    if (mid * mid * mid > a)
      r = mid;
    else
      l = mid;
  }
  return l;
}
long long max(long long a, long long b) {
  if (a > b) return a;
  return b;
}
long long min(long long a, long long b) { return -1 * max(-a, -b); }
long long possible(long long q) {
  if (q == INF) return -1;
  return q;
}
bool correct(int x, int xx) {
  if (x < 0) return 0;
  if (x >= xx) return 0;
  return 1;
}
long long dsumm(long long x, long long k) {
  long long y = 1;
  long long z = 0;
  for (int i = 0; y < 1e18; i++) {
    z += x / y % k;
    y *= k;
  }
  return z;
}
long long dcount(long long x) {
  long long y = 1;
  long long z = 0;
  int c[100];
  for (int i = 0; i < 10; i++) c[i] = 0;
  for (int i = 0; x > 0; i++) {
    if (c[x / y % 10] == 0) z++;
    c[x / y % 10] = 1;
    x /= 10;
  }
  return z;
}
long long lg10(long long x) {
  if (10000 <= x && x < 100000) return 5;
  if (x == 0) return 0;
  return lg10(x / 10) + 1;
}
long long g(long long x, long long mod) {
  if (x == 0) return 0;
  return x / mod + g(x / mod, mod);
}
bool is_digit(char c) { return ('0' <= c && c <= '9'); }
long long n, m, k;
map<vector<int>, int> mm;
long long q(vector<int> a, vector<int> b) {
  if (a.size() + b.size() == 1) return 0;
  vector<int> c;
  for (int i = 0; i < a.size(); i++) c.push_back(a[i]);
  for (int i = 0; i < b.size(); i++) c.push_back(b[i]);
  sort((c).begin(), (c).end());
  if (mm[c] != 0) return mm[c] - 1;
  cout << "? " << a.size() + b.size() << endl;
  for (int i = 0; i < a.size(); i++) {
    cout << a[i] << " ";
  }
  for (int i = 0; i < b.size(); i++) {
    cout << b[i] << " ";
  }
  cout << endl;
  long long x;
  cin >> x;
  mm[c] = x + 1;
  return x;
}
long long q(vector<int> a) {
  if (a.size() == 1) return 0;
  sort((a).begin(), (a).end());
  if (mm[a] != 0) return mm[a] - 1;
  cout << "? " << a.size() << endl;
  for (int i = 0; i < a.size(); i++) {
    cout << a[i] << " ";
  }
  cout << endl;
  long long x;
  cin >> x;
  mm[a] = x + 1;
  return x;
}
pair<int, int> find_edge_between(vector<int> a, vector<int> b) {
  if (a.size() == 0 || b.size() == 0) {
    return {-1, -1};
  }
  if (a.size() == 1 && b.size() == 1) {
    vector<int> c;
    c.push_back(a[0]);
    c.push_back(b[0]);
    if (q(c))
      return {a[0], b[0]};
    else
      return {-1, -1};
  }
  if (b.size() == 1) {
    swap(a, b);
  }
  vector<int> c, d;
  for (int i = 0; i < b.size() / 2; i++) c.push_back(b[i]);
  for (int i = b.size() / 2; i < b.size(); i++) d.push_back(b[i]);
  if (q(a, c) > q(a) + q(c))
    return find_edge_between(a, c);
  else
    return find_edge_between(a, d);
}
vector<int> graph[700];
void spawning_tree() {
  vector<int> x;
  vector<int> is(700);
  is[1] = 1;
  x.push_back(1);
  while (x.size() != n) {
    vector<int> y;
    for (int i = 1; i <= n; i++) {
      if (!(is[i])) y.push_back(i);
    }
    pair<int, int> e = find_edge_between(x, y);
    pair<int, int> no = {-1, -1};
    if (no == e) break;
    if (is[e.first]) {
      is[e.second] = 1;
      x.push_back(e.second);
      graph[e.first].push_back(e.second);
      graph[e.second].push_back(e.first);
    } else {
      is[e.first] = 1;
      x.push_back(e.first);
      graph[e.first].push_back(e.second);
      graph[e.second].push_back(e.first);
    }
  }
}
long long c[700];
vector<int> p1;
vector<int> p2;
void dfs(int x, int fl) {
  c[x] = 1;
  if (fl == 1)
    p1.push_back(x);
  else
    p2.push_back(x);
  for (int i = 0; i < graph[x].size(); i++) {
    long long u = graph[x][i];
    if (c[u] == 0) {
      dfs(u, 1 - fl);
    }
  }
}
long long beg, en;
long long pmt = 0;
vector<int> cc;
long long prev1234[5000];
void dfs(int x, int pr, int q) {
  prev1234[x] = pr;
  if (pmt == 1) return;
  c[x] = 2;
  for (int i = 0; i < graph[x].size(); i++) {
    long long u = graph[x][i];
    if (c[u] != 2) {
      prev1234[u] = x;
      if (u == en && pmt == 0) {
        vector<int> cnts(4000);
        while (u != beg) {
          cc.push_back(u);
          cnts[u]++;
          u = prev1234[u];
          if (cnts[u] > 0) break;
        }
        if (cnts[beg] == 0) cc.push_back(beg);
        pmt = 1;
        return;
      }
      dfs(u, x, INF);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  if (n == 1) {
    cout << "Y 1" << endl;
    cout << 1 << endl;
    return 0;
  }
  spawning_tree();
  dfs(1, 1);
  pair<int, int> no = {-1, -1};
  if (q(p1) == 0 && q(p2) == 0) {
    cout << "Y " << p1.size() << endl;
    for (int i = 0; i < p1.size(); i++) {
      cout << p1[i] << " ";
    }
    cout << endl;
    return 0;
  }
  if (q(p1) == 0) {
    swap(p1, p2);
  }
  long long y = 0;
  for (int i = max(1, p1.size() - 1); i < p1.size(); i++) {
    vector<int> q1, q2;
    for (int j = 0; j < i; j++) q1.push_back(p1[j]);
    for (int j = i; j < p1.size(); j++) q2.push_back(p1[j]);
    pair<int, int> F = find_edge_between(q1, q2);
    if (F != no) {
      graph[F.first].push_back(F.second);
      graph[F.second].push_back(F.first);
      beg = F.first;
      en = F.second;
      y = 1;
      break;
    }
  }
  if (y == 0) {
    for (int i = 1; i < p1.size(); i++) {
      vector<int> q1, q2;
      for (int j = 0; j < i; j++) q1.push_back(p1[j]);
      for (int j = i; j < p1.size(); j++) q2.push_back(p1[j]);
      pair<int, int> F = find_edge_between(q1, q2);
      if (F != no) {
        graph[F.first].push_back(F.second);
        graph[F.second].push_back(F.first);
        beg = F.first;
        en = F.second;
        y = 1;
        break;
      }
    }
  }
  dfs(beg, -INF, INF);
  cout << "N " << cc.size() << endl;
  for (int i = 0; i < cc.size(); i++) {
    cout << cc[i] << " ";
  }
  cout << endl;
}
