#include <bits/stdc++.h> using namespace std; void Yes(){cout << "YES\n";} void No(){cout << "NO\n";} int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector<tuple<int,int,int>> ABC(N); map<pair<int,int>,vector<int>> M; int idx = 0; for(auto &[a,b,c] : ABC){ cin >> a >> b >> c; M[{a,b}].push_back(idx); M[{b,c}].push_back(idx); M[{a,c}].push_back(idx++); } bool yes = true; vector<int> LR(N,-1); for(int i=0; i<N; i++){ if(LR.at(i) != -1) continue; LR.at(i) = 0; queue<int> Q; Q.push(i); while(Q.size()){ int pos = Q.front(); Q.pop(); auto [a1,b1,c1] = ABC.at(pos); for(auto to : M[{a1,b1}]){ if(to == pos) continue; auto [a2,b2,c2] = ABC.at(to); int lr = LR.at(pos); int t = 0; if(a2 == a1 && c2 == b1) t = 1; lr ^= 1^t; if(LR.at(to) == -1) LR.at(to) = lr,Q.push(to); else if(LR.at(to) != lr){yes = false; break;} } if(!yes) break; for(auto to : M[{b1,c1}]){ if(to == pos) continue; auto [a2,b2,c2] = ABC.at(to); int lr = LR.at(pos); int t = 0; if(a2 == b1 && c2 == c1) t = 1; lr ^= 1^t; if(LR.at(to) == -1) LR.at(to) = lr,Q.push(to); else if(LR.at(to) != lr){yes = false; break;} } if(!yes) break; for(auto to : M[{a1,c1}]){ if(to == pos) continue; auto [a2,b2,c2] = ABC.at(to); int lr = LR.at(pos); int t = 0; if(a2 == a1 && c2 == c1) t = 1; lr ^= t; if(LR.at(to) == -1) LR.at(to) = lr,Q.push(to); else if(LR.at(to) != lr){yes = false; break;} } if(!yes) break; } if(!yes) break; } if(yes) Yes(); else No(); }