# include using namespace std; typedef long long ll; // # define int long long # define lc u << 1 # define rc u << 1 | 1 # define fi first # define se second const int N = 1005; int n; struct node { int x, y, z; } a[N]; vector e[N]; int ind[N]; int f[N]; signed main () { // freopen ("box.in", "r", stdin); freopen ("box.out", "w", stdout); scanf ("%d", &n); for (int i = 1; i <= n; i ++ ) { scanf ("%d%d%d", &a[i].x, &a[i].y, &a[i].z); vector vec; vec.push_back (a[i].x); vec.push_back (a[i].y); vec.push_back (a[i].z); sort (vec.begin (), vec.end ()); a[i].x = vec[0], a[i].y = vec[1], a[i].z = vec[2]; } for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= n; j ++ ) { if (a[i].x < a[j].x && a[i].y < a[j].y && a[i].z < a[j].z) e[i].push_back (j), ind[j] ++ ; } } queue q; for (int i = 1; i <= n; i ++ ) { if (!ind[i]) { q.push (i); f[i] = 1; } } while (!q.empty ()) { int u = q.front (); q.pop (); for (auto v : e[u]) { if (!( -- ind[v])) { q.push (v); f[v] = f[u] + 1; } } } int ans = 0; for (int i = 1; i <= n; i ++ ) ans = max (ans, f[i]); printf ("%d\n", ans); return 0; }