#include <fstream>
#include <queue>
using namespace std;
ifstream f ("royfloyd.in");
ofstream g ("royfloyd.out");
int n;
int a[105][105];
int dist[105];
queue < int > coada;
void Dijktra (int start)
{
coada.push(start);
while (!coada.empty())
{
int nod = coada.front();
coada.pop();
for (int i=1; i<=n; i++)
{
if (a[nod][i] && i != start)
{
if (dist[i] == 0)
{
dist[i] = dist[nod] + a[nod][i];
coada.push(i);
}
else if (dist[nod] + a[nod][i] < dist[i])
{
dist[i] = dist[nod] + a[nod][i];
coada.push(i);
}
}
}
}
for (int i=1; i<=n; i++)
{
g << dist[i] << " ";
dist[i] = 0;
}
g << "\n";
}
int main()
{
f >> n;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
f >> a[i][j];
}
}
for (int i=1; i<=n; i++)
Dijktra(i);
return 0;
}