#include <iostream>
#include <vector>
#include <array>
#include <set>

using namespace std;

int main(){
    int n;
    cin>> n;
    vector<array<int,5> > A(n);
    for(auto& a: A) for(int &i :a) cin>> i;
    //for(auto& a: A) for(int &i :a) cout <<i<<" ";
    int left=0, right = 1e9+1;
    auto check = [&](int x)-> bool{
        set<int> s;
        for(auto& a: A){
            int bit = 0;
            for(int& i :a){
                bit <<=1;
                bit |= i>=x;
            }
            s.insert(bit);
        }
        for(int x: s) for(int y: s) for(int z: s){
            if((x|y|z)==31) return 1;
        }
        return 0;
    };
    while(left+1<right){
        int cen = (left + right) / 2;
        if(check(cen)){
            left = cen;
        }else{
            right = cen;
        }   
    }
        
    cout << left << endl;
    return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<algorithm>
using namespace std;

const int N=50005;

int n;
int w[N][5],ans;

int mn[N][1<<5],a[N];

inline bool check(int val) {
	for(int i=1 ; i<=n ; ++i) a[i]=0;
	for(int i=1 ; i<=n ; ++i) for(int j=0 ; j<5 ; ++j) if(w[i][j]>=val) a[i]|=1<<j;
	for(int i=1 ; i<=n ; ++i) {
		for(int S=0 ; S<32 ; ++S) mn[i][S]=mn[i-1][S];
		for(int S=0 ; S<32 ; ++S) mn[i][S|a[i]]=min(mn[i-1][S]+1,mn[i][S|a[i]]);
	}
	return mn[n][31]<=3;
}

int main() {
	int l=0,r=1000000000;
	scanf("%d",&n);
	for(int i=1 ; i<=n ; ++i) for(int j=0 ; j<5 ; ++j) scanf("%d",&w[i][j]);
	mn[0][0]=0;
	for(int i=1 ; i<32 ; ++i) mn[0][i]=4;
	while(l<=r) {
		int mid=(l+r)>>1;
		if(check(mid)) ans=mid,l=mid+1;
		else r=mid-1;
	}
	printf("%d",ans);
	return 0;
}