#include <bits/stdc++.h> #include <atcoder/all> using namespace std; using namespace atcoder; int main () { int N; cin >> N; int siz = 0; map<pair<int, int>, int> mp; std::vector<int> cnt; vector<vector<int>> ids; vector<tuple<int, int, int>> A(N); using P = pair<int, int>; for (int j = 0; j < N; j ++) { auto& [a, b, c] = A[j]; cin >> a >> b >> c; int X[] = {a, b, c, a}; for (int i = 0; i < 3; i ++) { int p = min(X[i], X[i+1]), q = max(X[i], X[i+1]); if (mp.find(P{p, q}) == mp.end()) { mp[P{p, q}] = siz++; cnt.push_back(0); ids.push_back({}); } cnt[mp[P{p, q}]] ++; ids[mp[P{p, q}]].push_back((j + 1) * (i < 2 ? 1 : -1)); } } if (*max_element(cnt.begin(), cnt.end()) > 2) { puts("NO"); return 0; } two_sat TS(siz); for (auto& v : ids) { if (v.size() == 2) { int a = v[0], b = v[1]; int i = abs(a), j = abs(b); TS.add_clause(i, (a > 0), j, (b > 0)); TS.add_clause(i, (a < 0), j, (b < 0)); } } cout << (TS.satisfiable() ? "YES" : "NO") << endl; }