#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
template < class T1, class T2> void sortA_L( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
int i;
pair< T1, T2> * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second = b[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second ;
}
}
template < class T1, class T2, class T3> void sortA_L( int N, T1 a[ ] , T2 b[ ] , T3 c[ ] , void * mem = wmem) {
int i;
pair< T1, pair< T2, T3> > * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second .first = b[ i] ;
arr[ i] .second .second = c[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second .first ;
c[ i] = arr[ i] .second .second ;
}
}
inline int my_getchar_unlocked( ) {
static char buf[ 1048576 ] ;
static int s = 1048576 ;
static int e = 1048576 ;
if ( s == e && e == 1048576 ) {
e = fread_unlocked( buf, 1 , 1048576 , stdin ) ;
s = 0 ;
}
if ( s == e) {
return EOF ;
}
return buf[ s++ ] ;
}
inline void rd( int & x) {
int k;
int m= 0 ;
x= 0 ;
for ( ;; ) {
k = my_getchar_unlocked( ) ;
if ( k== '-' ) {
m= 1 ;
break ;
}
if ( '0' <= k&& k<= '9' ) {
x= k- '0' ;
break ;
}
}
for ( ;; ) {
k = my_getchar_unlocked( ) ;
if ( k< '0' || k> '9' ) {
break ;
}
x= x* 10 + k- '0' ;
}
if ( m) {
x= - x;
}
}
struct MY_WRITER{
char buf[ 1048576 ] ;
int s;
int e;
MY_WRITER( ) {
s = 0 ;
e = 1048576 ;
}
~MY_WRITER( ) {
if ( s) {
fwrite_unlocked( buf, 1 , s, stdout ) ;
}
}
}
;
MY_WRITER MY_WRITER_VAR;
void my_putchar_unlocked( int a) {
if ( MY_WRITER_VAR.s == MY_WRITER_VAR.e ) {
fwrite_unlocked( MY_WRITER_VAR.buf , 1 , MY_WRITER_VAR.s , stdout ) ;
MY_WRITER_VAR.s = 0 ;
}
MY_WRITER_VAR.buf [ MY_WRITER_VAR.s ++ ] = a;
}
inline void wt_L( char a) {
my_putchar_unlocked( a) ;
}
inline void wt_L( int x) {
int s= 0 ;
int m= 0 ;
char f[ 10 ] ;
if ( x< 0 ) {
m= 1 ;
x= - x;
}
while ( x) {
f[ s++ ] = x% 10 ;
x/ = 10 ;
}
if ( ! s) {
f[ s++ ] = 0 ;
}
if ( m) {
my_putchar_unlocked( '-' ) ;
}
while ( s-- ) {
my_putchar_unlocked( f[ s] + '0' ) ;
}
}
template < class S> inline void arrInsert( const int k, int & sz, S a[ ] , const S aval) {
int i;
sz++ ;
for ( i= sz- 1 ; i> k; i-- ) {
a[ i] = a[ i- 1 ] ;
}
a[ k] = aval;
}
template < class S, class T> inline void arrInsert( const int k, int & sz, S a[ ] , const S aval, T b[ ] , const T bval) {
int i;
sz++ ;
for ( i= sz- 1 ; i> k; i-- ) {
a[ i] = a[ i- 1 ] ;
}
for ( i= sz- 1 ; i> k; i-- ) {
b[ i] = b[ i- 1 ] ;
}
a[ k] = aval;
b[ k] = bval;
}
template < class S, class T, class U> inline void arrInsert( const int k, int & sz, S a[ ] , const S aval, T b[ ] , const T bval, U c[ ] , const U cval) {
int i;
sz++ ;
for ( i= sz- 1 ; i> k; i-- ) {
a[ i] = a[ i- 1 ] ;
}
for ( i= sz- 1 ; i> k; i-- ) {
b[ i] = b[ i- 1 ] ;
}
for ( i= sz- 1 ; i> k; i-- ) {
c[ i] = c[ i- 1 ] ;
}
a[ k] = aval;
b[ k] = bval;
c[ k] = cval;
}
template < class S, class T, class U, class V> inline void arrInsert( const int k, int & sz, S a[ ] , const S aval, T b[ ] , const T bval, U c[ ] , const U cval, V d[ ] , const V dval) {
int i;
sz++ ;
for ( i= sz- 1 ; i> k; i-- ) {
a[ i] = a[ i- 1 ] ;
}
for ( i= sz- 1 ; i> k; i-- ) {
b[ i] = b[ i- 1 ] ;
}
for ( i= sz- 1 ; i> k; i-- ) {
c[ i] = c[ i- 1 ] ;
}
for ( i= sz- 1 ; i> k; i-- ) {
d[ i] = d[ i- 1 ] ;
}
a[ k] = aval;
b[ k] = bval;
c[ k] = cval;
d[ k] = dval;
}
struct unionFind{
int * d;
int N;
int M;
inline void malloc ( const int n) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
}
inline void malloc ( const int n, const int fg) {
d = ( int * ) std:: malloc ( n* sizeof ( int ) ) ;
M = n;
if ( fg) {
init( n) ;
}
}
inline void free ( void ) {
std:: free ( d) ;
}
inline void walloc( const int n, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
}
inline void walloc( const int n, const int fg, void ** mem= & wmem) {
walloc1d( & d, n, mem) ;
M = n;
if ( fg) {
init( n) ;
}
}
inline void init( const int n) {
int i;
N = n;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
d[ i] = - 1 ;
}
}
inline void init( void ) {
init( M) ;
}
inline int get( int a) {
int t = a;
int k;
while ( d[ t] >= 0 ) {
t= d[ t] ;
}
while ( d[ a] >= 0 ) {
k= d[ a] ;
d[ a] = t;
a= k;
}
return a;
}
inline int connect( int a, int b) {
if ( d[ a] >= 0 ) {
a= get( a) ;
}
if ( d[ b] >= 0 ) {
b= get( b) ;
}
if ( a== b) {
return 0 ;
}
if ( d[ a] < d[ b] ) {
d[ a] + = d[ b] ;
d[ b] = a;
}
else {
d[ b] + = d[ a] ;
d[ a] = b;
}
return 1 ;
}
inline int operator( ) ( int a) {
return get( a) ;
}
inline int operator( ) ( int a, int b) {
return connect( a,b) ;
}
inline int & operator[ ] ( const int a) {
return d[ a] ;
}
inline int size( int a) {
a = get( a) ;
return - d[ a] ;
}
inline int sizeList( int res[ ] ) {
int i;
int sz= 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( d[ i] < 0 ) {
res[ sz++ ] = - d[ i] ;
}
}
return sz;
}
}
;
int N;
int A[ 500 ] [ 500 ] ;
int m;
int x[ 200000 ] ;
int y[ 200000 ] ;
int z[ 200000 ] ;
int main( ) {
int i;
wmem = memarr;
int res = 0 ;
unionFind uf;
rd( N) ;
{
int Lj4PdHRW;
int KL2GvlyY;
for ( Lj4PdHRW= ( 0 ) ; Lj4PdHRW< ( N) ; Lj4PdHRW++ ) {
for ( KL2GvlyY= ( 0 ) ; KL2GvlyY< ( N) ; KL2GvlyY++ ) {
rd( A[ Lj4PdHRW] [ KL2GvlyY] ) ;
}
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
int j;
for ( j= ( i+ 1 ) ; j< ( N) ; j++ ) {
arrInsert( m, m, x, i, y, j, z, A[ i] [ j] ) ;
}
}
sortA_L( m, z, x, y) ;
uf.malloc ( 2 * N,1 ) ;
for ( i= ( 0 ) ; i< ( m) ; i++ ) {
res = z[ i] ;
uf( x[ i] , y[ i] + N) ;
uf( x[ i] + N, y[ i] ) ;
if ( uf( x[ i] ) == uf( x[ i] + N) || uf( y[ i] ) == uf( y[ i] + N) ) {
break ;
}
}
wt_L( res) ;
wt_L( '\n ' ) ;
return 0 ;
}
// cLay version 20201123-1
// --- original code ---
// int N, A[500][500];
// int m, x[2d5], y[2d5], z[2d5];
// {
// int res = 0;
// unionFind uf;
// rd(N,A(N,N));
// rep(i,N) rep(j,i+1,N) arrInsert(m, m, x, i, y, j, z, A[i][j]);
// sortA(m, z, x, y);
// uf.malloc(2*N,1);
// rep(i,m){
// res = z[i];
// uf(x[i], y[i]+N);
// uf(x[i]+N, y[i]);
// if(uf(x[i])==uf(x[i]+N) || uf(y[i])==uf(y[i]+N)) break;
// }
// wt(res);
// }
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQqd21lbTsKY2hhciBtZW1hcnJbOTYwMDAwMDBdOwp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeCwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICBzdGF0aWMgaW50IHNraXBbMTZdID0gezAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDF9OwogICgqbWVtKSA9ICh2b2lkKikoICgoY2hhciopKCptZW0pKSArIHNraXBbKCh1bnNpZ25lZCBsb25nIGxvbmcpKCptZW0pKSAmIDE1XSApOwogICgqYXJyKT0oVCopKCptZW0pOwogICgqbWVtKT0oKCphcnIpK3gpOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4MSwgaW50IHgyLCB2b2lkICoqbWVtID0gJndtZW0pewogIHdhbGxvYzFkKGFyciwgeDIteDEsIG1lbSk7CiAgKCphcnIpIC09IHgxOwp9CnRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4gdm9pZCBzb3J0QV9MKGludCBOLCBUMSBhW10sIFQyIGJbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgcGFpcjxUMSwgVDI+KmFycjsKICB3YWxsb2MxZCgmYXJyLCBOLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXS5maXJzdCA9IGFbaV07CiAgICBhcnJbaV0uc2Vjb25kID0gYltpXTsKICB9CiAgc29ydChhcnIsIGFycitOKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFbaV0gPSBhcnJbaV0uZmlyc3Q7CiAgICBiW2ldID0gYXJyW2ldLnNlY29uZDsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4gdm9pZCBzb3J0QV9MKGludCBOLCBUMSBhW10sIFQyIGJbXSwgVDMgY1tdLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaTsKICBwYWlyPFQxLCBwYWlyPFQyLCBUMz4gPiphcnI7CiAgd2FsbG9jMWQoJmFyciwgTiwgJm1lbSk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnJbaV0uZmlyc3QgPSBhW2ldOwogICAgYXJyW2ldLnNlY29uZC5maXJzdCA9IGJbaV07CiAgICBhcnJbaV0uc2Vjb25kLnNlY29uZCA9IGNbaV07CiAgfQogIHNvcnQoYXJyLCBhcnIrTik7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhW2ldID0gYXJyW2ldLmZpcnN0OwogICAgYltpXSA9IGFycltpXS5zZWNvbmQuZmlyc3Q7CiAgICBjW2ldID0gYXJyW2ldLnNlY29uZC5zZWNvbmQ7CiAgfQp9CmlubGluZSBpbnQgbXlfZ2V0Y2hhcl91bmxvY2tlZCgpewogIHN0YXRpYyBjaGFyIGJ1ZlsxMDQ4NTc2XTsKICBzdGF0aWMgaW50IHMgPSAxMDQ4NTc2OwogIHN0YXRpYyBpbnQgZSA9IDEwNDg1NzY7CiAgaWYocyA9PSBlICYmIGUgPT0gMTA0ODU3Nil7CiAgICBlID0gZnJlYWRfdW5sb2NrZWQoYnVmLCAxLCAxMDQ4NTc2LCBzdGRpbik7CiAgICBzID0gMDsKICB9CiAgaWYocyA9PSBlKXsKICAgIHJldHVybiBFT0Y7CiAgfQogIHJldHVybiBidWZbcysrXTsKfQppbmxpbmUgdm9pZCByZChpbnQgJngpewogIGludCBrOwogIGludCBtPTA7CiAgeD0wOwogIGZvcig7Oyl7CiAgICBrID0gbXlfZ2V0Y2hhcl91bmxvY2tlZCgpOwogICAgaWYoaz09Jy0nKXsKICAgICAgbT0xOwogICAgICBicmVhazsKICAgIH0KICAgIGlmKCcwJzw9ayYmazw9JzknKXsKICAgICAgeD1rLScwJzsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGZvcig7Oyl7CiAgICBrID0gbXlfZ2V0Y2hhcl91bmxvY2tlZCgpOwogICAgaWYoazwnMCd8fGs+JzknKXsKICAgICAgYnJlYWs7CiAgICB9CiAgICB4PXgqMTAray0nMCc7CiAgfQogIGlmKG0pewogICAgeD0teDsKICB9Cn0Kc3RydWN0IE1ZX1dSSVRFUnsKICBjaGFyIGJ1ZlsxMDQ4NTc2XTsKICBpbnQgczsKICBpbnQgZTsKICBNWV9XUklURVIoKXsKICAgIHMgPSAwOwogICAgZSA9IDEwNDg1NzY7CiAgfQogIH5NWV9XUklURVIoKXsKICAgIGlmKHMpewogICAgICBmd3JpdGVfdW5sb2NrZWQoYnVmLCAxLCBzLCBzdGRvdXQpOwogICAgfQogIH0KfQo7Ck1ZX1dSSVRFUiBNWV9XUklURVJfVkFSOwp2b2lkIG15X3B1dGNoYXJfdW5sb2NrZWQoaW50IGEpewogIGlmKE1ZX1dSSVRFUl9WQVIucyA9PSBNWV9XUklURVJfVkFSLmUpewogICAgZndyaXRlX3VubG9ja2VkKE1ZX1dSSVRFUl9WQVIuYnVmLCAxLCBNWV9XUklURVJfVkFSLnMsIHN0ZG91dCk7CiAgICBNWV9XUklURVJfVkFSLnMgPSAwOwogIH0KICBNWV9XUklURVJfVkFSLmJ1ZltNWV9XUklURVJfVkFSLnMrK10gPSBhOwp9CmlubGluZSB2b2lkIHd0X0woY2hhciBhKXsKICBteV9wdXRjaGFyX3VubG9ja2VkKGEpOwp9CmlubGluZSB2b2lkIHd0X0woaW50IHgpewogIGludCBzPTA7CiAgaW50IG09MDsKICBjaGFyIGZbMTBdOwogIGlmKHg8MCl7CiAgICBtPTE7CiAgICB4PS14OwogIH0KICB3aGlsZSh4KXsKICAgIGZbcysrXT14JTEwOwogICAgeC89MTA7CiAgfQogIGlmKCFzKXsKICAgIGZbcysrXT0wOwogIH0KICBpZihtKXsKICAgIG15X3B1dGNoYXJfdW5sb2NrZWQoJy0nKTsKICB9CiAgd2hpbGUocy0tKXsKICAgIG15X3B1dGNoYXJfdW5sb2NrZWQoZltzXSsnMCcpOwogIH0KfQp0ZW1wbGF0ZTxjbGFzcyBTPiBpbmxpbmUgdm9pZCBhcnJJbnNlcnQoY29uc3QgaW50IGssIGludCAmc3osIFMgYVtdLCBjb25zdCBTIGF2YWwpewogIGludCBpOwogIHN6Kys7CiAgZm9yKGk9c3otMTtpPms7aS0tKXsKICAgIGFbaV0gPSBhW2ktMV07CiAgfQogIGFba10gPSBhdmFsOwp9CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSB2b2lkIGFyckluc2VydChjb25zdCBpbnQgaywgaW50ICZzeiwgUyBhW10sIGNvbnN0IFMgYXZhbCwgVCBiW10sIGNvbnN0IFQgYnZhbCl7CiAgaW50IGk7CiAgc3orKzsKICBmb3IoaT1zei0xO2k+aztpLS0pewogICAgYVtpXSA9IGFbaS0xXTsKICB9CiAgZm9yKGk9c3otMTtpPms7aS0tKXsKICAgIGJbaV0gPSBiW2ktMV07CiAgfQogIGFba10gPSBhdmFsOwogIGJba10gPSBidmFsOwp9CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQsIGNsYXNzIFU+IGlubGluZSB2b2lkIGFyckluc2VydChjb25zdCBpbnQgaywgaW50ICZzeiwgUyBhW10sIGNvbnN0IFMgYXZhbCwgVCBiW10sIGNvbnN0IFQgYnZhbCwgVSBjW10sIGNvbnN0IFUgY3ZhbCl7CiAgaW50IGk7CiAgc3orKzsKICBmb3IoaT1zei0xO2k+aztpLS0pewogICAgYVtpXSA9IGFbaS0xXTsKICB9CiAgZm9yKGk9c3otMTtpPms7aS0tKXsKICAgIGJbaV0gPSBiW2ktMV07CiAgfQogIGZvcihpPXN6LTE7aT5rO2ktLSl7CiAgICBjW2ldID0gY1tpLTFdOwogIH0KICBhW2tdID0gYXZhbDsKICBiW2tdID0gYnZhbDsKICBjW2tdID0gY3ZhbDsKfQp0ZW1wbGF0ZTxjbGFzcyBTLCBjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWPiBpbmxpbmUgdm9pZCBhcnJJbnNlcnQoY29uc3QgaW50IGssIGludCAmc3osIFMgYVtdLCBjb25zdCBTIGF2YWwsIFQgYltdLCBjb25zdCBUIGJ2YWwsIFUgY1tdLCBjb25zdCBVIGN2YWwsIFYgZFtdLCBjb25zdCBWIGR2YWwpewogIGludCBpOwogIHN6Kys7CiAgZm9yKGk9c3otMTtpPms7aS0tKXsKICAgIGFbaV0gPSBhW2ktMV07CiAgfQogIGZvcihpPXN6LTE7aT5rO2ktLSl7CiAgICBiW2ldID0gYltpLTFdOwogIH0KICBmb3IoaT1zei0xO2k+aztpLS0pewogICAgY1tpXSA9IGNbaS0xXTsKICB9CiAgZm9yKGk9c3otMTtpPms7aS0tKXsKICAgIGRbaV0gPSBkW2ktMV07CiAgfQogIGFba10gPSBhdmFsOwogIGJba10gPSBidmFsOwogIGNba10gPSBjdmFsOwogIGRba10gPSBkdmFsOwp9CnN0cnVjdCB1bmlvbkZpbmR7CiAgaW50KmQ7CiAgaW50IE47CiAgaW50IE07CiAgaW5saW5lIHZvaWQgbWFsbG9jKGNvbnN0IGludCBuKXsKICAgIGQgPSAoaW50KilzdGQ6Om1hbGxvYyhuKnNpemVvZihpbnQpKTsKICAgIE0gPSBuOwogIH0KICBpbmxpbmUgdm9pZCBtYWxsb2MoY29uc3QgaW50IG4sIGNvbnN0IGludCBmZyl7CiAgICBkID0gKGludCopc3RkOjptYWxsb2MobipzaXplb2YoaW50KSk7CiAgICBNID0gbjsKICAgIGlmKGZnKXsKICAgICAgaW5pdChuKTsKICAgIH0KICB9CiAgaW5saW5lIHZvaWQgZnJlZSh2b2lkKXsKICAgIHN0ZDo6ZnJlZShkKTsKICB9CiAgaW5saW5lIHZvaWQgd2FsbG9jKGNvbnN0IGludCBuLCB2b2lkICoqbWVtPSZ3bWVtKXsKICAgIHdhbGxvYzFkKCZkLCBuLCBtZW0pOwogICAgTSA9IG47CiAgfQogIGlubGluZSB2b2lkIHdhbGxvYyhjb25zdCBpbnQgbiwgY29uc3QgaW50IGZnLCB2b2lkICoqbWVtPSZ3bWVtKXsKICAgIHdhbGxvYzFkKCZkLCBuLCBtZW0pOwogICAgTSA9IG47CiAgICBpZihmZyl7CiAgICAgIGluaXQobik7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGluaXQoY29uc3QgaW50IG4pewogICAgaW50IGk7CiAgICBOID0gbjsKICAgIGZvcihpPSgwKTtpPChuKTtpKyspewogICAgICBkW2ldID0gLTE7CiAgICB9CiAgfQogIGlubGluZSB2b2lkIGluaXQodm9pZCl7CiAgICBpbml0KE0pOwogIH0KICBpbmxpbmUgaW50IGdldChpbnQgYSl7CiAgICBpbnQgdCA9IGE7CiAgICBpbnQgazsKICAgIHdoaWxlKGRbdF0+PTApewogICAgICB0PWRbdF07CiAgICB9CiAgICB3aGlsZShkW2FdPj0wKXsKICAgICAgaz1kW2FdOwogICAgICBkW2FdPXQ7CiAgICAgIGE9azsKICAgIH0KICAgIHJldHVybiBhOwogIH0KICBpbmxpbmUgaW50IGNvbm5lY3QoaW50IGEsIGludCBiKXsKICAgIGlmKGRbYV0+PTApewogICAgICBhPWdldChhKTsKICAgIH0KICAgIGlmKGRbYl0+PTApewogICAgICBiPWdldChiKTsKICAgIH0KICAgIGlmKGE9PWIpewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmKGRbYV0gPCBkW2JdKXsKICAgICAgZFthXSArPSBkW2JdOwogICAgICBkW2JdID0gYTsKICAgIH0KICAgIGVsc2V7CiAgICAgIGRbYl0gKz0gZFthXTsKICAgICAgZFthXSA9IGI7CiAgICB9CiAgICByZXR1cm4gMTsKICB9CiAgaW5saW5lIGludCBvcGVyYXRvcigpKGludCBhKXsKICAgIHJldHVybiBnZXQoYSk7CiAgfQogIGlubGluZSBpbnQgb3BlcmF0b3IoKShpbnQgYSwgaW50IGIpewogICAgcmV0dXJuIGNvbm5lY3QoYSxiKTsKICB9CiAgaW5saW5lIGludCYgb3BlcmF0b3JbXShjb25zdCBpbnQgYSl7CiAgICByZXR1cm4gZFthXTsKICB9CiAgaW5saW5lIGludCBzaXplKGludCBhKXsKICAgIGEgPSBnZXQoYSk7CiAgICByZXR1cm4gLWRbYV07CiAgfQogIGlubGluZSBpbnQgc2l6ZUxpc3QoaW50IHJlc1tdKXsKICAgIGludCBpOwogICAgaW50IHN6PTA7CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaWYoZFtpXTwwKXsKICAgICAgICByZXNbc3orK10gPSAtZFtpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHN6OwogIH0KfQo7CmludCBOOwppbnQgQVs1MDBdWzUwMF07CmludCBtOwppbnQgeFsyMDAwMDBdOwppbnQgeVsyMDAwMDBdOwppbnQgelsyMDAwMDBdOwppbnQgbWFpbigpewogIGludCBpOwogIHdtZW0gPSBtZW1hcnI7CiAgaW50IHJlcyA9IDA7CiAgdW5pb25GaW5kIHVmOwogIHJkKE4pOwogIHsKICAgIGludCBMajRQZEhSVzsKICAgIGludCBLTDJHdmx5WTsKICAgIGZvcihMajRQZEhSVz0oMCk7TGo0UGRIUlc8KE4pO0xqNFBkSFJXKyspewogICAgICBmb3IoS0wyR3ZseVk9KDApO0tMMkd2bHlZPChOKTtLTDJHdmx5WSsrKXsKICAgICAgICByZChBW0xqNFBkSFJXXVtLTDJHdmx5WV0pOwogICAgICB9CiAgICB9CiAgfQogIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgaW50IGo7CiAgICBmb3Ioaj0oaSsxKTtqPChOKTtqKyspewogICAgICBhcnJJbnNlcnQobSwgbSwgeCwgaSwgeSwgaiwgeiwgQVtpXVtqXSk7CiAgICB9CiAgfQogIHNvcnRBX0wobSwgeiwgeCwgeSk7CiAgdWYubWFsbG9jKDIqTiwxKTsKICBmb3IoaT0oMCk7aTwobSk7aSsrKXsKICAgIHJlcyA9IHpbaV07CiAgICB1Zih4W2ldLCB5W2ldK04pOwogICAgdWYoeFtpXStOLCB5W2ldKTsKICAgIGlmKHVmKHhbaV0pPT11Zih4W2ldK04pIHx8IHVmKHlbaV0pPT11Zih5W2ldK04pKXsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHd0X0wocmVzKTsKICB3dF9MKCdcbicpOwogIHJldHVybiAwOwp9Ci8vIGNMYXkgdmVyc2lvbiAyMDIwMTEyMy0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gaW50IE4sIEFbNTAwXVs1MDBdOwovLyBpbnQgbSwgeFsyZDVdLCB5WzJkNV0sIHpbMmQ1XTsKLy8gewovLyAgIGludCByZXMgPSAwOwovLyAgIHVuaW9uRmluZCB1ZjsKLy8gICByZChOLEEoTixOKSk7Ci8vICAgcmVwKGksTikgcmVwKGosaSsxLE4pIGFyckluc2VydChtLCBtLCB4LCBpLCB5LCBqLCB6LCBBW2ldW2pdKTsKLy8gICBzb3J0QShtLCB6LCB4LCB5KTsKLy8gICB1Zi5tYWxsb2MoMipOLDEpOwovLyAgIHJlcChpLG0pewovLyAgICAgcmVzID0geltpXTsKLy8gICAgIHVmKHhbaV0sIHlbaV0rTik7Ci8vICAgICB1Zih4W2ldK04sIHlbaV0pOwovLyAgICAgaWYodWYoeFtpXSk9PXVmKHhbaV0rTikgfHwgdWYoeVtpXSk9PXVmKHlbaV0rTikpIGJyZWFrOwovLyAgIH0KLy8gICB3dChyZXMpOwovLyB9Cg==