#include <algorithm>
#include <cmath>
#include <cstdlib>

template <typename T, typename P>
T bisect(T ok, T ng, const P& is_ok)
{
	while (std::abs(ok - ng) > 1) {
		auto mid = ok + (ng - ok) / 2;
		if (is_ok(mid)) {
			ok = mid;
		}
		else {
			ng = mid;
		}
	}
	return ok;
}

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int P = 5;

int main()
{

	int N;
	cin >> N;
	vector<vector<int>> A(N, vector<int>(P));
	for (auto& v : A) {
		for (auto& x : v) {
			cin >> x;
		}
	}

	int ok = 0;
	int ng = 1000 * 1000 * 1000 + 1;

	auto is_ok = [&](int m) {
		auto B = A;
		for (auto& v : B) {
			for (auto& x : v) {
				if (x < m) {
					x = 0;
				}
				else {
					x = 1;
				}

			}
		}
		sort(B.begin(), B.end());
		B.erase(unique(B.begin(), B.end()), B.end());

		const int M = B.size();

		for (int i = 0; i < M; ++i) {
			for (int j = 0; j < M; ++j) {
				for (int k = 0; k < M; ++k) {
					vector<int> T(P);
					for (int s = 0; s < P; ++s) {
						T[s] = max({ B[i][s], B[j][s], B[k][s] });
					}
					if (*min_element(T.begin(), T.end()) == 1) {
						return true;
					}
				}
			}
		}
		return false;
	};

	cout << bisect(ok, ng, is_ok) << endl;
}

#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<string>
#include<vector>
#include<set>

#define rep(i,n) for(int i = 0;i < n;i++)
using namespace std;

std::vector<bool> IsPrime;

void sieve(long long int max){
    if(max+1 > IsPrime.size()){     // resizeで要素数が減らないように
        IsPrime.resize(max+1,true); // IsPrimeに必要な要素数を確保
    } 
    IsPrime[0] = false; // 0は素数ではない
    IsPrime[1] = false; // 1は素数ではない

    for(long long int  i=2; i*i<=max; ++i) // 0からsqrt(max)まで調べる
        if(IsPrime[i]) // iが素数ならば
            for(size_t j=2; i*j<=max; ++j) // (max以下の)iの倍数は
                IsPrime[i*j] = false;      // 素数ではない
}



int main(void){

    //n以下の素数列挙
    long long int n;
    cin >> n;
    long long int ans=0;
    set<long long int> se;

   // sieve(n);

    //n = sqrt(n);



    long long int n_temp=n;
    for(long long int i=2;i*i<=n;i++){
            long long int j=2;
            long long int kari=i*i;
            while((kari)<=n){
                se.insert(kari);
              kari*=i;
            }
    }
    //求めるのは表せないものなので、

    

    cout << n-se.size()<< endl;



    return 0;
}