#include<queue>
#include<cstdio>
#include<cstring>
#define N 5500
#define M 50000
using namespace std;
int win[101],cnt;
int src,decc;
int front[N],nxt[M],to[M],tot=1,from[M];
int cost[M],cap[M],pre[N];
int dis[N],ans[101][101];
bool v[N];
queue<int>q;
void add(int u,int v,int w,int val)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w; cost[tot]=val; from[tot]=u;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; cap[tot]=0; cost[tot]=-val; from[tot]=v;
}
bool spfa()
{
memset(dis,127,sizeof(dis));
memset(v,0,sizeof(v));
dis[src]=0; q.push(src); v[src]=true;
int now;
while(!q.empty())
{
now=q.front();
q.pop(); v[now]=false;
for(int i=front[now];i;i=nxt[i])
{
if(cap[i]>0&&dis[to[i]]>dis[now]+cost[i])
{
dis[to[i]]=dis[now]+cost[i];
pre[to[i]]=i;
if(!v[to[i]])
{
v[to[i]]=true;
q.push(to[i]);
}
}
}
}
return dis[decc]<2e9;
}
int main()
{
int n,x;
scanf("%d",&n);
cnt=n+1;decc=n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
if(j>=i) continue;
if(!x)
{
win[j]++;
ans[j][i]=1;
cnt++;
add(src,cnt,1,0);
add(cnt,j,1,0);
}
else if(x==1)
{
win[i]++;
ans[i][j]=1;
cnt++;
add(src,cnt,1,0);
add(cnt,i,1,0);
}
else
{
cnt++;
add(src,cnt,1,0);
add(cnt,i,1,0);
add(cnt,j,1,0);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=win[i];j++) add(i,decc,1,0);
for(int j=win[i]+1;j<n;j++) add(i,decc,1,j-1);
}
int tmp=0;
while(spfa())
{
tmp+=dis[decc];
for(int i=pre[decc];i;i=pre[from[i]])
{
cap[i]--; cap[i^1]++;
}
}
for(int i=front[src];i;i=nxt[i])
{
int j1=front[to[i]],j2=nxt[j1];
if(cap[j1]) ans[to[j2]][to[j1]]=1;
else ans[to[j1]][to[j2]]=1;
}
int sum=n*(n-1)*(n-2)/6;
for(int i=1;i<=n;i++)
sum-=win[i]*(win[i]-1)/2;
printf("%d\n",sum-tmp);
for(int i=1;i<=n;i++)
{
for(int j=1;j<n;j++)
printf("%d ",ans[i][j]);
printf("\n");
}
}