#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("royfloyd.in");
ofstream fout("royfloyd.out");
int n, m;
vector<vector<int>> d;
const int INF = 1e6;
void FloydWarshall() {
//acronimul KIA -> K(intermediar) -> I (sursa) -> J (destinatie)
for (int k=1;k<=n;k++) { // pasul k, nodul intermediar ("pivotul")
// am voie sa folosesc nodul k ca punct de legatura pt scurtarea drumurilor?
for (int i=1;i<=n;i++) { // nodul sursa (start)
for (int j=1;j<=n;j++) { // nodul destinatie (final)
//daca pot ajunge de la i la k si de la k la j gen i->j
if (d[i][k] != INF && d[k][j] != INF) {
if (d[i][j] > d[i][k] + d[k][j]) {
d[i][j]=d[i][k] + d[k][j];
}
}
}
}
}
}
int main() {
fin>>n;
d.resize(n+1);
for (int i=1;i<=n;i++) {
d[i].resize(n+1);
for (int j=1;j<=n;j++) {
int a;
fin>>a;
if (i==j) d[i][j]=0;
else if (a==0) d[i][j] = INF;
else d[i][j]=a;
}
}
FloydWarshall();
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) {
fout<<d[i][j]<<" ";
}
fout<<endl;
}
}