#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
#include<stdlib.h>
#include<map>
#include<vector>
using namespace std;
#define mod 1000000007
#define ll long long
#define ull unsigned long long
bool ar[100][100];
struct Point
{
int x;
int y;
}points[100];
int orientation(Point p, Point q, Point r)
{
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
}
bool doIntersect(Point p1, Point q1, Point p2, Point q2)
{
/*printf("%d %d\n",p1.x,p1.y);
printf("%d %d\n",q1.x,q1.y);
printf("%d %d\n",p2.x,p2.y);
printf("%d %d\n",q2.x,q2.y);*/
int o1 = orientation(p1, q1, p2);
int o2 = orientation(p1, q1, q2);
int o3 = orientation(p2, q2, p1);
int o4 = orientation(p2, q2, q1);
if (o1 != o2 && o3 != o4)
return 1;
else return 0;
}
int main()
{
int t,n,b[3000][100],itr=0,flag;
char road[100][100];
bool visited[55];
fill(visited,visited+55,0);
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&points[i].x,&points[i].y);
gets(road[0]);
for(int i=0;i<n;i++)
gets(road[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(road[i][j]=='Y'&&ar[i][j]==0)
{
ar[i][j]=1;
ar[j][i]=1;
b[itr][0]=1;
b[itr][1]=i;
b[itr][2]=j;
visited[i]=1;
visited[j]=1;
int x=i,y=j;
flag=1;
while(flag)
{
flag=0;
for(int k=0;k<n;k++)
{
if(road[y][k]=='Y'&&ar[y][k]==0&&visited[k]==0)
{
bool a=0;
for(int w=1;w<b[itr][0];w++)
{
a=doIntersect(points[y],points[k],points[b[itr][w]],points[b[itr][w+1]]);
if(a==1)
break;
}
if(a==0)
{
b[itr][0]++;
int o=b[itr][0];
b[itr][o+1]=k;
visited[k]=1;
ar[y][k]=1;
ar[k][y]=1;
flag=1;
x=y;
y=k;
}
}
}
}
itr++;
fill(visited,visited+55,0);
/*ar[i][j]=1;flag=0;
for(int k=0;k<n;k++)
{
if(road[j][k]=='Y'&&ar[j][k]==0&&k!=i)
{
ar[j][k]=1;
flag=1;
b[itr][0]=2;
b[itr][1]=i;
b[itr][2]=j;
b[itr][3]=k;
itr++;
break;
}
}
if(flag==0)
{
b[itr][0]=1;
b[itr][1]=i;
b[itr][2]=j;
itr++;
}*/
}
}
}
printf("%d\n",itr);
for(int i=0;i<itr;i++)
{
printf("%d ",b[i][0]);
for(int j=1;j<=b[i][0]+1;j++)
printf("%d ",b[i][j]);
printf("\n");
}
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bWF0aC5oPgojaW5jbHVkZTxzdHJpbmcuaD4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTxsaW1pdHMuaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPG1hcD4KI2luY2x1ZGU8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIG1vZCAxMDAwMDAwMDA3CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwpib29sIGFyWzEwMF1bMTAwXTsKc3RydWN0IFBvaW50CnsKICAgIGludCB4OwogICAgaW50IHk7Cn1wb2ludHNbMTAwXTsKaW50IG9yaWVudGF0aW9uKFBvaW50IHAsIFBvaW50IHEsIFBvaW50IHIpCnsKICAgIGludCB2YWwgPSAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0KICAgICAgICAgICAgICAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpOwogCiAgICBpZiAodmFsID09IDApIHJldHVybiAwOyAgLy8gY29saW5lYXIKIAogICAgcmV0dXJuICh2YWwgPiAwKT8gMTogMjsgLy8gY2xvY2sgb3IgY291bnRlcmNsb2NrIHdpc2UKfQpib29sIGRvSW50ZXJzZWN0KFBvaW50IHAxLCBQb2ludCBxMSwgUG9pbnQgcDIsIFBvaW50IHEyKQp7CgkvKnByaW50ZigiJWQgJWRcbiIscDEueCxwMS55KTsKCXByaW50ZigiJWQgJWRcbiIscTEueCxxMS55KTsKCXByaW50ZigiJWQgJWRcbiIscDIueCxwMi55KTsKCXByaW50ZigiJWQgJWRcbiIscTIueCxxMi55KTsqLwogICAgaW50IG8xID0gb3JpZW50YXRpb24ocDEsIHExLCBwMik7CiAgICBpbnQgbzIgPSBvcmllbnRhdGlvbihwMSwgcTEsIHEyKTsKICAgIGludCBvMyA9IG9yaWVudGF0aW9uKHAyLCBxMiwgcDEpOwogICAgaW50IG80ID0gb3JpZW50YXRpb24ocDIsIHEyLCBxMSk7CiAKICAgIGlmIChvMSAhPSBvMiAmJiBvMyAhPSBvNCkKICAgIHJldHVybiAxOwogICAgZWxzZSByZXR1cm4gMDsKfQppbnQgbWFpbigpCnsKCWludCB0LG4sYlszMDAwXVsxMDBdLGl0cj0wLGZsYWc7CgljaGFyIHJvYWRbMTAwXVsxMDBdOwoJYm9vbCB2aXNpdGVkWzU1XTsKCWZpbGwodmlzaXRlZCx2aXNpdGVkKzU1LDApOwoJCXNjYW5mKCIlZCIsJm4pOwoJCWZvcihpbnQgaT0wO2k8bjtpKyspCgkJc2NhbmYoIiVkJWQiLCZwb2ludHNbaV0ueCwmcG9pbnRzW2ldLnkpOwoJCWdldHMocm9hZFswXSk7CgkJZm9yKGludCBpPTA7aTxuO2krKykKCQlnZXRzKHJvYWRbaV0pOwoJCWZvcihpbnQgaT0wO2k8bjtpKyspCgkJewoJCQlmb3IoaW50IGo9MDtqPG47aisrKQoJCQl7CgkJCQkKCQkJCWlmKHJvYWRbaV1bal09PSdZJyYmYXJbaV1bal09PTApCgkJCQl7CgkJCQkJYXJbaV1bal09MTsKCQkJCQlhcltqXVtpXT0xOwoJCQkJCWJbaXRyXVswXT0xOwoJCQkJCWJbaXRyXVsxXT1pOwoJCQkJCWJbaXRyXVsyXT1qOwoJCQkJCXZpc2l0ZWRbaV09MTsKCQkJCQl2aXNpdGVkW2pdPTE7CgkJCQkJaW50IHg9aSx5PWo7CgkJCQkJZmxhZz0xOwoJCQkJCXdoaWxlKGZsYWcpCgkJCQkJewoJCQkJCQlmbGFnPTA7CgkJCQkJCWZvcihpbnQgaz0wO2s8bjtrKyspCgkJCQkJCXsKCQkJCQkJCWlmKHJvYWRbeV1ba109PSdZJyYmYXJbeV1ba109PTAmJnZpc2l0ZWRba109PTApCgkJCQkJCQl7CgkJCQkJCQkJYm9vbCBhPTA7CgkJCQkJCQkJZm9yKGludCB3PTE7dzxiW2l0cl1bMF07dysrKQoJCQkJCQkJCXsKCQkJCQkJCQkJYT1kb0ludGVyc2VjdChwb2ludHNbeV0scG9pbnRzW2tdLHBvaW50c1tiW2l0cl1bd11dLHBvaW50c1tiW2l0cl1bdysxXV0pOwoJCQkJCQkJCQlpZihhPT0xKQoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJaWYoYT09MCkKCQkJCQkJCQl7CgkJCQkJCQkJCWJbaXRyXVswXSsrOwoJCQkJCQkJCQlpbnQgbz1iW2l0cl1bMF07CgkJCQkJCQkJCWJbaXRyXVtvKzFdPWs7CgkJCQkJCQkJCXZpc2l0ZWRba109MTsKCQkJCQkJCQkJYXJbeV1ba109MTsKCQkJCQkJCQkJYXJba11beV09MTsKCQkJCQkJCQkJZmxhZz0xOwoJCQkJCQkJCQl4PXk7CgkJCQkJCQkJCXk9azsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJaXRyKys7CgkJCQkJZmlsbCh2aXNpdGVkLHZpc2l0ZWQrNTUsMCk7CgkJCQkJCgkJCQkJLyphcltpXVtqXT0xO2ZsYWc9MDsKCQkJCQlmb3IoaW50IGs9MDtrPG47aysrKQoJCQkJCXsKCQkJCQkJaWYocm9hZFtqXVtrXT09J1knJiZhcltqXVtrXT09MCYmayE9aSkKCQkJCQkJewoJCQkJCQkJYXJbal1ba109MTsKCQkJCQkJCWZsYWc9MTsKCQkJCQkJCWJbaXRyXVswXT0yOwoJCQkJCQkJYltpdHJdWzFdPWk7CgkJCQkJCQliW2l0cl1bMl09ajsKCQkJCQkJCWJbaXRyXVszXT1rOwoJCQkJCQkJaXRyKys7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZihmbGFnPT0wKQoJCQkJCXsKCQkJCQkJYltpdHJdWzBdPTE7CgkJCQkJCWJbaXRyXVsxXT1pOwoJCQkJCQliW2l0cl1bMl09ajsKCQkJCQkJaXRyKys7CgkJCQkJfSovCgkJCQl9CgkJCX0KCQl9CgkJcHJpbnRmKCIlZFxuIixpdHIpOwoJCWZvcihpbnQgaT0wO2k8aXRyO2krKykKCQl7CgkJCXByaW50ZigiJWQgIixiW2ldWzBdKTsKCQkJZm9yKGludCBqPTE7ajw9YltpXVswXSsxO2orKykKCQkJcHJpbnRmKCIlZCAiLGJbaV1bal0pOwoJCQlwcmludGYoIlxuIik7CgkJCQoJCX0KCQp9Cg==