#include<stdio.h>
#include<set>
using namespace std;
FILE *f = fopen("grozavesti.in","r");
FILE *g = fopen("grozavesti.out","w");
#define MaxN 400
#define MaxVal 1000
int N,Sol;
int A[MaxN][MaxN];
int SolV[MaxN*2][4];
set<pair<int,int> > viz[MaxVal];
void citire(void)
{
fscanf(f,"%d ",&N);
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
fscanf(f,"%d ",&A[i][j]);
}
void afisare(void)
{
for(int i=1;i<=N;i++,printf("\n"))
for(int j=1;j<=N;j++)
printf("%d ",A[i][j]);
printf("\n");
for(int i=1;i<=9;i++)
printf("%d ",viz[i].size());
printf("\n");
}
void preprocesare(void)
{
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
viz[A[i][j]].insert(make_pair(i,j));
}
inline void swap(int a,int b,int c,int d)
{
int valA = A[a][b],valB = A[c][d];
viz[valA].erase(make_pair(a,b));
viz[valB].erase(make_pair(c,d));
viz[valB].insert(make_pair(a,b));
viz[valA].insert(make_pair(c,d));
int aux = A[a][b];
A[a][b] = A[c][d];
A[c][d] = aux;
}
inline void change(int p1,int p2,int diag)
{
if(p1 != diag)
{
for(int i=1;i<=diag;i++)
{
swap(p1,i,diag,i);
//printf("wtf sa dhsad ashjd asjd ash linie = %d %d %d\n",p1,diag,i);
}
SolV[++Sol][0] = 0;
SolV[Sol][1] = p1;
SolV[Sol][2] = diag;
}
if(p2 != diag)
{
for(int i=1;i<=diag;i++)
{
swap(i,p2,i,diag);
//printf("wtf sa dhsad ashjd asjd ash coloana = %d %d %d\n",p2,diag,i);
}
SolV[++ Sol][0] = 1;
SolV[Sol][1] = p2;
SolV[Sol][2] = diag;
}
for(int i=1;i<diag;i++)
{
viz[A[i][diag]].erase(viz[A[i][diag]].find(make_pair(i,diag)));
viz[A[diag][i]].erase(viz[A[diag][i]].find(make_pair(diag,i)));
}
viz[A[diag][diag]].erase(viz[A[diag][diag]].find(make_pair(diag,diag)));
}
void Rezolvare(void)
{
int valMax = 1000;
for(int i=N;i;--i)
{
for(;!viz[valMax].size();--valMax);
change(viz[valMax].begin()->first,viz[valMax].begin()->second,i);
//printf("dsjhgdadasd\n");
//afisare();
}
}
int main()
{
citire();
preprocesare();
Rezolvare();
fprintf(g,"%d\n",Sol);
for(int i=1;i<=Sol;i++)
fprintf(g,"%c %d %d\n",SolV[i][0] ? 'C' : 'L',SolV[i][1],SolV[i][2]);
}