#include "bits/stdc++.h"
#define rep(i,n) for(int i = 0; i < (n); ++i)
using namespace std;
typedef long long int ll;
typedef pair<ll, ll> P;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }

void solve(){
    int n;
    cin >> n;
    set<ll> st;
    vector<vector<ll>> a(n, vector<ll>(5));
    rep(i,n){
        rep(j,5){
            cin >> a[i][j];
            st.insert(a[i][j]);
        }
    }
    ll ans = 0;
    vector<ll> S;
    for(auto p : st) S.push_back(p);
    int ok = 0, ng = S.size();
    while(ng - ok > 1){
        int mid = (ok + ng) / 2;
        vector<vector<bool>> v(4, vector<bool>(1<<5, false));
        v[0][0] = true;
        rep(i,n){
            for(int j = 2; j >= 0; --j){
                rep(k,(1<<5)){
                    if(!v[j][k]) continue;
                    int nj = j+1;
                    int nk = k;
                    rep(l,5){
                        if(a[i][l] >= S[mid]){
                            nk |= (1<<l);
                        }
                    }
                    v[nj][nk] = true;
                }
            }
        }
        if(v[3][(1<<5)-1]){
            ok = mid;
        }
        else{
            ng = mid;
        }
    }
    cout << S[ok] << endl;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    solve();
    return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define pi 3.141592653589793238
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define zip(i,a,b) for(int i=a;i<b;i++)
#define rzip(i,a,b) for(int i=a;i>=b;i--)
#define ll unsigned int
#define test int t;cin>>t; while(t--)
#define en '\n'
typedef pair<int, int>     pii;
typedef pair<char, int>    pci;
typedef pair<char, char>   pcc;
typedef vector<pii>       vii;
typedef long double ld;
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(),v.rend()
#define sz(x) (int)x.size()
#define INF (1e18+5)
#define inf (1e9+5)
#define mod 1000000007


void __print(int x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
// You should only debug a pair of simple data types. For example,
// the debug won't work if one of pair's elements is collection type
// (std::vector, std::map, std::set...).
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i : x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif


// bool check_prime(int n)  return whether a number is prime or not O(sqrt(N));
// int BE(int x,int n,int m)  return x^n%m; O(logN);
// void sieve()  from number 1-1000001 saare prime store kar lega  in bool is_prime[1000001] array
// vector<int> z_array(string s)  return vector which is Z-array of string s;
// vector<int> lps(string s)      return vector which is lps array of string s;
// int power(int x,int n) return x^n; O(logN);
// using_ordered_set (template for using ordered set , replace first 2 lines of this page with this code..);
const int gf = 1e6 + 9;
int a[gf][5];
int power(int x, int n) //function to calculate x raise to power n
{
	int result = 1;
	while (n > 0)
	{
		if (n % 2 == 1)
			result = result * x;
		x = x * x;
		n = n / 2;
	}
	return result;
}
int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(0);
#ifndef ONLINE_JUDGE
	if (fopen("input.txt", "r"))
	{
		freopen ("input.txt" , "r" , stdin);
		freopen ("output.txt" , "w" , stdout);
	}
#endif
	//_______________________________-code starts-_______________________________________________

	int n;
	cin >> n;
	//int a[n], b[n], c[n], d[n], e[n];
	zip(i, 0, n)
	{
		cin >> a[i][0] >> a[i][1] >> a[i][2] >> a[i][3] >> a[i][4];
	}
	int l = 1, r = 1e9;
	int ans = 0;
	while (l <= r)
	{
		int m = (l + r) / 2;
		//debug(l, r);
		set<int>s;
		zip(i, 0, n)
		{
			int var = 0;
			zip(k, 0, 5)
			{
				if (a[i][k] >= m)
					var += power(2, 4 - k);
			}
			s.insert(var);
		}
		//	debug(s);
		int flag = 0;
		for (int p : s)for (int q : s)for (int r : s)
				{
					int lol = p | q | r;
					if (lol == 31)flag = 1;
				}
		debug(s, flag);

		if (flag)
		{
			ans = m;
			l = m + 1;
		}
		else
		{
			r = m - 1;
		}
	}
	cout << ans << en;




	return 0;

}


