#include using namespace std; #define rep(i,a,b) for(int i=a;i vi; typedef vector vvi; bool visit(const vector& g, int v, vector& order, vector& color) { color[v] = 1; for (int u : g[v]) { if (color[u] == 2) continue; if (color[u] == 1) return false; if (!visit(g, u, order, color)) return false; } order.push_back(v); color[v] = 2; return true; } bool TopologicalSort(const vector& g, vector& order) { int n = g.size(); vector color(n); for (int u = 0; u < n; u++) if (!color[u] && !visit(g, u, order, color)) return false; reverse(order.begin(), order.end()); return true; } //----------------------------------------------------------------------------------- int N; int X[1010], Y[1010], Z[1010]; //----------------------------------------------------------------------------------- int cnt[1010]; int main() { cin >> N; rep(i, 0, N) scanf("%d%d%d", &X[i], &Y[i], &Z[i]); rep(i, 0, N) { int hi = max(X[i], max(Y[i], Z[i])); int lo = min(X[i], min(Y[i], Z[i])); int md = X[i] + Y[i] + Z[i] - hi - lo; X[i] = lo; Y[i] = md; Z[i] = hi; } vvi E(N, vi()); rep(i, 0, N) rep(j, 0, N) if(i != j){ if (X[i] < X[j]) if (Y[i] < Y[j]) if (Z[i] < Z[j]) { E[j].push_back(i); } } vi order; TopologicalSort(E, order); rep(i, 0, N) cnt[i] = 1; rep(_i, 0, N) { int cu = order[_i]; for (int to : E[cu]) { cnt[to] = max(cnt[to], cnt[cu] + 1); } } int ans = 0; rep(i, 0, N) ans = max(ans, cnt[i]); cout << ans << endl; }