#include <iostream>
#define MAX 999999
using namespace std;
int dist[501]; //用来存储每个点到点1的距离
int vis[501]; //用来存储点访问情况
int map[501][501]; //用来存储邻接矩阵
int n; //节点的数目
int findmin() //找寻当前状态下到达目标节点路径最短的点
{
int minnode = 0,min = MAX;
for(int i = 1;i <= n;i++)
if(min > dist[i] && !vis[i])
{
min = dist[i];
minnode = i;
}
return minnode;
}
int main()
{
int i,j,n,vnum;
cin >> n;
memset(map,MAX,sizeof(map));
for(i = 1;i <= n;i++)
for(j = 1;j <= n;j++)
{
cin >> map[i][j];
if(map[i][j] == 0) map[i][j] = MAX;
}
for(i = 1;i <= n;i++) dist[i] = map[1][i];
vis[1] = true;
vnum = 1;
while(vnum < n)
{
int node = findmin();
if(node != 0)
{
vnum ++;
vis[node] = true;
for(i = 1;i <= n;i++)
if(dist[i] > dist[node] + map[node][i] && !vis[i])
dist[i] = dist[node] +map[node][i];
}
else break;
}
for(i = 1;i <= n;i++)
{
if(dist[i] == MAX)
cout<<-1<<" ";
else cout<<dist[i]<<" ";
}
return 0;
}