#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;
}