#include <bits/stdc++.h>
using namespace std;
int INK, C = 3;
bool adj[2200][2200];
void join(int i, int j) {
  assert(!adj[i][j]);
  adj[i][j] = adj[j][i] = 1;
}
vector<int> o, nu;
int est(int K, int n = 2) {
  if (n == 2) {
    int cnt = 0, LEN = 2;
    for (int i = 31; i--;)
      if ((1 << i) & K) {
        LEN = max(LEN, i);
        cnt += LEN - (i + 1);
        cnt += i * 2;
      }
    return cnt;
  }
  int cnt = 0;
  int pr = 0;
  vector<int> v;
  while (K) {
    for (int x = (0); x < (K % n); x++) v.push_back(pr);
    K /= n, pr++;
  }
  int LEN = 2;
  reverse(v.begin(), v.end());
  for (int i : v) {
    LEN = max(LEN, i + 1);
    cnt += LEN - (i + 1);
    cnt += i * n;
  }
  return cnt;
}
void go(int K, int INST, int INEN, int n = 2) {
  vector<int> v;
  int pr = 0;
  while (K) {
    for (int x = (0); x < (K % n); x++) v.push_back(pr);
    K /= n, pr++;
  }
  int LEN = 2;
  reverse(v.begin(), v.end());
  for (int i : v) {
    int ST = INST;
    LEN = max(LEN, i + 1);
    for (int rep = (i + 1); rep < (LEN); rep++) join(ST, C), ST = C, C++;
    o.clear();
    o.push_back(ST);
    for (int j = (0); j < (i + 1); j++) {
      nu.clear();
      if (j != i) {
        for (int x = (0); x < (n); x++) nu.push_back(C++);
      } else {
        nu.push_back(INEN);
      }
      for (int b : nu)
        for (int a : o) join(a, b);
      o = nu;
    }
  }
}
int main() {
  scanf("%d", &INK);
  if (est(INK) > 998) {
    bool can = 1;
    int sv = -1;
    for (int d = 1; d * d <= INK; d++)
      if (INK % d == 0) {
        if (est(d) + est(INK / d) + 3 <= 1000) {
          sv = d;
          can = 1;
          break;
        }
      }
    if (can) {
      C++;
      go(sv, 1, 3);
      go(INK / sv, 3, 2);
    } else
      assert(0);
  } else {
    go(INK, 1, 2);
  }
  printf("%d\n", C - 1);
  for (int i = (1); i < (C); i++) {
    for (int j = (1); j < (C); j++) {
      printf(adj[i][j] ? "Y" : "N");
    }
    puts("");
  }
  return 0;
}
