Problem: Fox Ciel wants to write a task for a programming contest. The task is: "You are given a simple undirected graph with n vertexes. Each its edge has unit length. You should calculate the number of shortest paths between vertex 1 and vertex 2."

Same with some writers, she wants to make an example with some certain output: for example, her birthday or the number of her boyfriend. Can you help her to make a test case with answer equal exactly to k?

Input

The first line contains a single integer k (1 ≤ k ≤ 109).

Output

You should output a graph G with n vertexes (2 ≤ n ≤ 1000). There must be exactly k shortest paths between vertex 1 and vertex 2 of the graph.

The first line must contain an integer n. Then adjacency matrix G with n rows and n columns must follow. Each element of the matrix must be 'N' or 'Y'. If Gij is 'Y', then graph G has a edge connecting vertex i and vertex j. Consider the graph vertexes are numbered from 1 to n.

The graph must be undirected and simple: Gii = 'N' and Gij = Gji must hold. And there must be at least one path between vertex 1 and vertex 2. It's guaranteed that the answer exists. If there multiple correct answers, you can output any of them. 

Examples

Input

2

Output

4
NNYY
NNYY
YYNN
YYNN

Input

9

Output

8
NNYYYNNN
NNNNNYYY
YNNNNYYY
YNNNNYYY
YNNNNYYY
NYYYYNNN
NYYYYNNN
NYYYYNNN

Input

1

Output

2
NY
YN

Note

In first example, there are 2 shortest paths: 1-3-2 and 1-4-2.

In second example, there are 9 shortest paths: 1-3-6-2, 1-3-7-2, 1-3-8-2, 1-4-6-2, 1-4-7-2, 1-4-8-2, 1-5-6-2, 1-5-7-2, 1-5-8-2.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
int K, V, Source, Destination;
vector<string> G;
vector<pair<int, int> > Edges;
inline void AddEdge(const int x, const int y) {
  Edges.push_back(make_pair(x, y));
}
inline void AddChain(const int width, const int chainLength,
                     const int totalLength) {
  vector<int> nodes = vector<int>(width);
  for (int i = 0; i < width; ++i) {
    nodes[i] = V++;
    AddEdge(Source, nodes[i]);
  }
  for (int i = 1; i < chainLength; ++i) {
    vector<int> newNodes = vector<int>(width);
    for (int j = 0; j < width; ++j) {
      newNodes[j] = V++;
      for (int k = 0; k < width; ++k) AddEdge(nodes[k], newNodes[j]);
    }
    nodes = newNodes;
  }
  int x = V++;
  for (int i = 0; i < width; ++i) AddEdge(nodes[i], x);
  for (int i = chainLength + 1; i < totalLength; ++i) {
    int newX = V++;
    AddEdge(x, newX);
    x = newX;
  }
  AddEdge(x, Destination);
}
inline int ChainCost(const int width, const int chainLength,
                     const int totalLength) {
  int count = width;
  for (int i = 1; i < chainLength; ++i) count += width;
  ++count;
  for (int i = chainLength + 1; i < totalLength; ++i) ++count;
  return count;
}
inline int Power(int value, int power) {
  int result = 1;
  for (; power > 0; power >>= 1) {
    if (power & 1) result *= value;
    value *= value;
  }
  return result;
}
int BaseCost(const int base) {
  int k = K, pathLength = 0, cost = 0;
  for (; Power(base, pathLength) <= k; ++pathLength)
    ;
  for (int i = 0; i < k % base; ++i) cost += ChainCost(1, 1, pathLength);
  k /= base;
  for (int digit = 1; k > 0; ++digit, k /= base)
    for (int i = 0; i < k % base; ++i)
      cost += ChainCost(base, digit, pathLength);
  return cost;
}
void SolveBase(const int base) {
  int k = K, pathLength = 0;
  for (; Power(base, pathLength) <= k; ++pathLength)
    ;
  for (int i = 0; i < k % base; ++i) AddChain(1, 1, pathLength);
  k /= base;
  for (int digit = 1; k > 0; ++digit, k /= base)
    for (int i = 0; i < k % base; ++i) AddChain(base, digit, pathLength);
}
void Solve() {
  Source = V++;
  Destination = V++;
  int base = 2;
  for (int i = 3; i < 10; ++i)
    if (BaseCost(i) < BaseCost(base)) base = i;
  SolveBase(base);
  G = vector<string>(V, "");
  for (int x = 0; x < V; ++x)
    for (int y = 0; y < V; ++y) G[x] += "N";
  for (const auto &e : Edges) G[e.first][e.second] = G[e.second][e.first] = 'Y';
}
void Read() { cin >> K; }
void Print() {
  cout << V << "\n";
  for (int x = 0; x < V; ++x) cout << G[x] << "\n";
}
int main() {
  Read();
  Solve();
  Print();
  return 0;
}