#include <cstdio>
#include <memory.h>
int map[1010][1010], sum[1010][1010], n, Tree[1010][1<<12], base;
inline int max(int a, int b) { return a>b?a:b; }
void Adj(int a, int b){ while(b) Tree[a][b] = max(Tree[a][2*b], Tree[a][2*b+1]), b>>=1; }
int GetSum(int a, int s, int e)
{
    int S = 0;
    if( s < base || e >= base+n ) return 0;
    if( a >= 0 )
    {
        while(s<e)
        {
            if( s%2==1 ) S+=Tree[a][s], s++;
            if( e%2==0 ) S+=Tree[a][e], e--;
            s>>=1, e>>=1;
        }
        if(s==e) S+=Tree[a][s];
    }
    return S+(sum[a+1][e-base]-sum[a+1][s-base-1]);
}
int main()
{
    //freopen(".10.in","r",stdin);
    //freopen(".10.out","w",stdout);
    int ans = 0;
    scanf("%d", &n);
    for(int i = 0 ; i < n ; i++ ) for( int j = 0 ; j < n ; j++ )
    {
        scanf("%d", &map[i][j]);
        if( j == 0 ) sum[i][j] = map[i][j];
        else sum[i][j] = sum[i][j-1] + map[i][j];
    }
    for(base = 1 ; base < n ; base<<=1);
    for(int i = 0 ; i < n ; i++ )
    {
        for(int j = 0 ; j < n ; j++ )
        {
            Tree[i][base+j] = max( (i==-1?0:(Tree[i-1][base+j])), max( GetSum(i-1,base+0,base+j-1), GetSum(i-1,base+j+1,base+n-1) ) ) + +map[i][j];
            Adj( i, (base+j)>>1 );
        }
    }
    for(int i = 0 ; i < n ; i++ )
        ans = max(ans, Tree[n-1][base+i]);
    printf("%d\n", ans);
    for(int i = 0 ; i < n ; i++, puts("")) for(int j = 0 ; j < n ; j++ )
        printf("%d ", Tree[i][base+j]);
}
