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.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class Solver {

	public static void main(String[] Args) throws NumberFormatException,
			IOException {
		new Solver().Run();
	}

	PrintWriter pw;
	StringTokenizer Stok;
	BufferedReader br;

	public String nextToken() throws IOException {
		while (Stok == null || !Stok.hasMoreTokens()) {
			Stok = new StringTokenizer(br.readLine());
		}
		return Stok.nextToken();
	}

	public int nextInt() throws NumberFormatException, IOException {
		return Integer.parseInt(nextToken());
	}

	public double nextDouble() throws NumberFormatException, IOException {
		return Double.parseDouble(nextToken());
	}

	public long nextLong() throws NumberFormatException, IOException {
		return Long.parseLong(nextToken());
	}

	int kolPath;
	boolean[][] result;
	int[] digits;
	int kolDigits;
	int maxNum=1;
	
	public void bindGroup(int minI, int maxI, int minJ, int maxJ ){
		for (int i=minI; i<=maxI; i++){
			for (int j=minJ; j<=maxJ; j++){
				result[i][j]=true;
				result[j][i]=true;
			}
		}
	}
	
	public void Run() throws NumberFormatException, IOException {
		//br = new BufferedReader(new FileReader("input.txt")); pw = new PrintWriter("output.txt");
		br=new BufferedReader(new InputStreamReader(System.in));  pw=new PrintWriter(new OutputStreamWriter(System.out));
		kolPath=nextInt();
		digits=new int[10];
		int zn=kolPath;
		int i=0;
		while (zn>0){
			digits[i]=zn%10;
			zn/=10;
			i++;
		}
		kolDigits=i;
		result=new boolean[1000][1000];
		int curVertex=1;
		//length of path equals kolDigits+1
		for (i=kolDigits-1; i>=0; i--){
			int curMin=0;
			int curMax=0;
			int nextMin, nextMax;
			for (int k=0; k<i; k++){
				nextMin=curVertex+1;
				nextMax=nextMin+9;
				curVertex=nextMax;
				bindGroup(curMin, curMax, nextMin, nextMax);
				curMin=nextMin;
				curMax=nextMax;
			}
			nextMin=curVertex+1;
			nextMax=nextMin+digits[i]-1;
			curVertex=nextMax;
			bindGroup(curMin, curMax, nextMin, nextMax);
			curMin=nextMin;
			curMax=nextMax;
			for (int k=0; k<kolDigits-1-i; k++){
				nextMin=curVertex+1;
				nextMax=nextMin;
				curVertex=nextMax;
				bindGroup(curMin, curMax, nextMin, nextMax);
				curMin=nextMin;
				curMax=nextMax;
			}
			nextMin=1;
			nextMax=1;
			bindGroup(curMin, curMax, nextMin, nextMax);
		}
		int kolVertex=curVertex+1;
		pw.println(kolVertex);
		for (i=0; i<kolVertex; i++){
			for (int j=0; j<kolVertex; j++){
				if (result[i][j])
					pw.print('Y');
				else
					pw.print('N');
			}
			pw.println();
		}
		pw.flush();
		pw.close();
	}

}
