#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <utility>
#include <sstream>
#include <map>
#include <set>
#include <ctime>
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef pair<int,int> PI;
const int inf=2000000000;
const LL INF=LL(inf)*inf;
const LL mod=1000000007LL;
double eps=1e-8;
#define mp make_pair
#define pb push_back
#define sc(x) scanf("%d",&(x))
#define MAXN 100001
struct Point
{
int x;
int y;
};
// To find orientation of ordered triplet (p, q, r).
// The function returns following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
int orientation(Point p, Point q, Point r)
{
// See 10th slides from following link for derivation of the formula
// http://w...content-available-to-author-only...c.uk/~pat/52233/slides/Geometry1x1.pdf
int val = (q.y - p.y) * (r.x - q.x) -
(q.x - p.x) * (r.y - q.y);
if (val == 0) return 0; // colinear
return (val > 0)? 1: 2; // clock or counterclock wise
}
int main()
{
int t,n,i,j,x,y;
freopen("input.txt","w",stdout);
n=50;
printf("%d\n",n);
srand(time(NULL));
Point p,p1,p2;
int A[101][101]={{0}};
int count=0;
vector<Point> v;
int coord=100;
while(count<n)
{
x=rand()%coord;
y=rand()%coord;
if(A[x][y]==0)
{
//printf("%d %d\n",x,y);
p.x=x;p.y=y;
for(j=0;j<v.size();j++)
{
for(int k=j+1;k<v.size();k++)
{
if(orientation(p,v[j],v[k])==0)
goto collinear;
}
}
A[p.x][p.y]=1;
count++;
v.pb(p);
}
collinear:{}
}
//printf("input:\n");
char S[n][n];
for(i=0;i<n;i++)
S[i][i]='N';
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
t=rand()%3;
if(t==2)
S[i][j]='N';
else
S[i][j]='Y';
S[j][i]=S[i][j];
}
}
for(i=0;i<v.size() ;i++)
cout<<v[i].x<<" "<<v[i].y<<endl;
//printf("%d %d\n",v[i].x,v[i].y);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%c",S[i][j]);
printf("\n");
}
fclose(stdout);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y21hdGg+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8Y3RpbWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBMTDsKdHlwZWRlZiB2ZWN0b3I8aW50PiBWSTsKdHlwZWRlZiB2ZWN0b3I8Vkk+IFZWSTsKdHlwZWRlZiBwYWlyPGludCxpbnQ+IFBJOwoKY29uc3QgaW50IGluZj0yMDAwMDAwMDAwOwpjb25zdCBMTCBJTkY9TEwoaW5mKSppbmY7CmNvbnN0IExMIG1vZD0xMDAwMDAwMDA3TEw7CmRvdWJsZSBlcHM9MWUtODsKCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgc2MoeCkgc2NhbmYoIiVkIiwmKHgpKQojZGVmaW5lIE1BWE4gMTAwMDAxCnN0cnVjdCBQb2ludAp7CiAgICBpbnQgeDsKICAgIGludCB5Owp9OwoKLy8gVG8gZmluZCBvcmllbnRhdGlvbiBvZiBvcmRlcmVkIHRyaXBsZXQgKHAsIHEsIHIpLgovLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBmb2xsb3dpbmcgdmFsdWVzCi8vIDAgLS0+IHAsIHEgYW5kIHIgYXJlIGNvbGluZWFyCi8vIDEgLS0+IENsb2Nrd2lzZQovLyAyIC0tPiBDb3VudGVyY2xvY2t3aXNlCmludCBvcmllbnRhdGlvbihQb2ludCBwLCBQb2ludCBxLCBQb2ludCByKQp7CiAgICAvLyBTZWUgMTB0aCBzbGlkZXMgZnJvbSBmb2xsb3dpbmcgbGluayBmb3IgZGVyaXZhdGlvbiBvZiB0aGUgZm9ybXVsYQogICAgLy8gaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmMudWsvfnBhdC81MjIzMy9zbGlkZXMvR2VvbWV0cnkxeDEucGRmCiAgICBpbnQgdmFsID0gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtCiAgICAgICAgICAgICAgKHEueCAtIHAueCkgKiAoci55IC0gcS55KTsKCiAgICBpZiAodmFsID09IDApIHJldHVybiAwOyAgLy8gY29saW5lYXIKCiAgICByZXR1cm4gKHZhbCA+IDApPyAxOiAyOyAvLyBjbG9jayBvciBjb3VudGVyY2xvY2sgd2lzZQp9CgppbnQgbWFpbigpCnsKCWludCB0LG4saSxqLHgseTsKCWZyZW9wZW4oImlucHV0LnR4dCIsInciLHN0ZG91dCk7CgluPTUwOwoJcHJpbnRmKCIlZFxuIixuKTsKCXNyYW5kKHRpbWUoTlVMTCkpOwoJUG9pbnQgcCxwMSxwMjsKCWludCBBWzEwMV1bMTAxXT17ezB9fTsKCWludCBjb3VudD0wOwoJdmVjdG9yPFBvaW50PiB2OwoJaW50IGNvb3JkPTEwMDsKCXdoaWxlKGNvdW50PG4pCgl7CiAgICAgICAgeD1yYW5kKCklY29vcmQ7CiAgICAgICAgeT1yYW5kKCklY29vcmQ7CiAgICAgICAgaWYoQVt4XVt5XT09MCkKICAgICAgICB7CiAgICAgICAgICAgIC8vcHJpbnRmKCIlZCAlZFxuIix4LHkpOwogICAgICAgICAgICBwLng9eDtwLnk9eTsKICAgICAgICAgICAgZm9yKGo9MDtqPHYuc2l6ZSgpO2orKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yKGludCBrPWorMTtrPHYuc2l6ZSgpO2srKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbihwLHZbal0sdltrXSk9PTApCiAgICAgICAgICAgICAgICAgICAgZ290byBjb2xsaW5lYXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQVtwLnhdW3AueV09MTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgdi5wYihwKTsKICAgICAgICB9CiAgICAgICAgY29sbGluZWFyOnt9Cgl9CgkvL3ByaW50ZigiaW5wdXQ6XG4iKTsKCWNoYXIgU1tuXVtuXTsKCWZvcihpPTA7aTxuO2krKykKCVNbaV1baV09J04nOwoJZm9yKGk9MDtpPG47aSsrKQoJewogICAgICAgIGZvcihqPWkrMTtqPG47aisrKQogICAgICAgIHsKICAgICAgICAgICAgdD1yYW5kKCklMzsKICAgICAgICAgICAgaWYodD09MikKICAgICAgICAgICAgU1tpXVtqXT0nTic7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgU1tpXVtqXT0nWSc7CiAgICAgICAgICAgIFNbal1baV09U1tpXVtqXTsKICAgICAgICB9CiAgICB9CiAgICBmb3IoaT0wO2k8di5zaXplKCkgIDtpKyspCiAgICBjb3V0PDx2W2ldLng8PCIgIjw8dltpXS55PDxlbmRsOwoJLy9wcmludGYoIiVkICVkXG4iLHZbaV0ueCx2W2ldLnkpOwoJZm9yKGk9MDtpPG47aSsrKQoJewogICAgICAgIGZvcihqPTA7ajxuO2orKykKICAgICAgICBwcmludGYoIiVjIixTW2ldW2pdKTsKICAgICAgICBwcmludGYoIlxuIik7Cgl9CglmY2xvc2Uoc3Rkb3V0KTsKfQoKCg==