#include<stdio.h>
#define INFINITY 65535
typedef struct Graph
{
	int vex[51];
	int arc[51][51];
	int vexnum,arcnum;//顶点数、边数
}Graph;

int CreateGraph(Graph *G,int n)
{
	int i,j;
	G->vexnum=n;
	for(i=0;i<n;i++)
		G->vex[i]=i;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		scanf("%d",&G->arc[i][j]);
		return 0;
}
void ShortestPath(Graph *G,int P[51][51][51],int D[51][51])
{
	int v,w,u,i;
	for(v=0;v<G->vexnum;v++)
		for(w=0;w<G->vexnum;w++)
		{
			D[v][w]=G->arc[v][w];
			if(v!=w&&!G->arc[v][w])
				D[v][w]=INFINITY;
			for(u=0;u<G->vexnum;u++)
				P[v][w][u]=0;
			if(D[v][w]<INFINITY)
				P[v][w][u]=P[v][w][w]=1;
		}
	for(u=0;u<G->vexnum;u++)
		for(v=0;v<G->vexnum;v++)
			for(w=0;w<G->vexnum;w++)
				if(D[v][u]+D[u][w]<D[v][w]&&D[v][u]+D[u][w])
				{
					D[v][w]=D[v][u]+D[u][w];
					for(i=0;i<G->vexnum;i++)
						P[v][w][i]=(P[v][u][i]||P[u][w][i]);
				}
	for(u=0;u<G->vexnum;u++)
	{
		for(v=0;v<G->vexnum;v++)
		{
			if(D[u][v]==INFINITY)
				printf("-1 ");
			else
			printf("%d ",D[u][v]);
		}
		printf("\n");
	}
}
int main()
{
	int n;//n个顶点,源点为s
	scanf("%d",&n);
	Graph G;
	CreateGraph(&G,n);
	int P[51][51][51],D[51][51];
	ShortestPath(&G,P,D);
	return 0;
}
/**************************************************************
	Problem: 2166
	User: admin
	Language: C
	Result: Accepted
	Time:7 ms
	Memory:1560 kb
****************************************************************/