#include<iostream> using namespace std; const int MAX=105; int n,flag; int visited[MAX],match[MAX],mat[MAX][MAX]; void init() { for(int i=1;i<MAX;i++) for(int j=1;j<MAX;j++) { mat[i][j]=0; } } int path(int u) { int i,v; for(v=1;v<=n;v++) { if(!visited[v]&&mat[u][v]) { visited[v]=1; if(match[v]==-1||path(match[v])) { match[v]=u; return 1; } } } return 0; } void max_match() { int i,ans=0; memset(match,-1,sizeof(match)); for(i=1;i<=n;i++) { memset(visited,0,sizeof(visited)); if(!path(i)) { flag=1; break; } } return ; } int main(void) { int count,i,j,t,a[MAX],b[MAX],c,m,k; while(scanf("%d",&n)==1) { flag=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); init(); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&mat[i][j]); max_match(); c=0; for(j=1;j<=n;j++) { m=j; for(k=j;k<=n;k++) if(match[k]<match[m]) m=k; if(m!=j) { a[c]=m; b[c]=j; c++; t=match[m]; match[m]=match[j]; match[j]=t; } } if(flag) printf("-1\n"); else { printf("%d\n",c); for(i=0;i<c;i++) printf("C %d %d\n",a[i],b[i]); } } } |