#include<iostream>
#include<algorithm>
using namespace std;
int map[1000][1000];
int nn,n;
void in(){
cin>>map[nn/n][nn%n];
nn++;
}
void out();
void xun1();
void xun2();
void xun3();
void xun4();
int ans = 0;
void (*ff1[])(){
xun2,out
};
void (*ff2[])(){
xun3,
xun1
};
void (*ff3[])(){
xun4,
xun2
};
void out3(){
cout<<ans<<endl;
exit(0);
}
void (*ff5[])(){
xun4,
out
};
int x5 = -1;
int x1 = -1 , x2, x3;
void out2(){
ddd:
x2++;
ans = max(ans,map[x5][x2]);
(*ff5[x2/n])();
goto ddd;
}
void (*ff4[])(){
out2,
out3
};
void out(){
ccc:
x5++;
x2 = -1;
(*ff4[x5/n])();
goto ccc;
}
void xun1(){
xu1:
x1++;
x2 = -1;
(*ff1[x1/n])();
goto xu1;
}
void xun2(){
xu2:
x2++;
x3 = -1;
(*ff2[x2/n])();
goto xu2;
}
void xun3(){
xu3:
x3++;
map[x3][x2] = map[x2][x3] = min(map[x2][x1]+map[x1][x3],map[x2][x3]);
(*ff3[x3/n])();
goto xu3;
}
void xun4(){
}
void (*f[])()={
in,
xun1
};
int main(){
cin>>n;
nn = 0;
aaa:;
(*f[nn/(n*n)])();
goto aaa;
}