#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct UnionFind {
  vector<int> p;
  UnionFind(int n):p(n,-1){}
  int find(int x){
    if(p[x] < 0) return x;
    return p[x] = find(p[x]);
  }
  bool unite(int x,int y) {
    x = find(x);
    y = find(y);
    if(x == y)return false;
    if(p[x] > p[y])swap(x,y);
    p[x] += p[y];
    p[y] = x;
    return true;
  }
  bool same(int x, int y) { return find(x) == find(y);}
  int size(int x) { return -p[find(x)];}
};
int main(){
  int M;
  cin >> M;
  vector<array<int, 3>> ABC(M);
  map<array<int, 2>, int> cnt;
  for (int i = 0; i < M; i++) {
    cin >> ABC[i][0] >> ABC[i][1] >> ABC[i][2];
    cnt[{ABC[i][0], ABC[i][1]}]++;
    cnt[{ABC[i][1], ABC[i][2]}]++;
    cnt[{ABC[i][0], ABC[i][2]}]++;
  }
  map<array<int, 2>, int> idx;
  map<int, array<int, 2>> xdi;
  for(auto [k, e] : cnt){
    if(e >= 3){
      cout << "NO\n";
      exit(0);
    }
    xdi[size(idx)] = k;
    idx[k] = size(idx);
  }
  int N = size(idx);
  vector<vector<int>> G(N);
  UnionFind uf(N);
  for (int i = 0; i < M; i++) {
    vector<int> to(3, -1);
    if(idx.contains({ABC[i][0], ABC[i][1]})){
      to[0] = idx[{ABC[i][0], ABC[i][1]}];
    }
    if(idx.contains({ABC[i][1], ABC[i][2]})){
      to[1] = idx[{ABC[i][1], ABC[i][2]}];
    }
    if(idx.contains({ABC[i][0], ABC[i][2]})){
      to[2] = idx[{ABC[i][0], ABC[i][2]}];
    }
    if(to[0] != -1 && to[1] != -1){
      uf.unite(to[0], to[1]);
    }
    if(to[1] != -1 && to[2] != -1){
      uf.unite(to[1], to[2]);
    }
    if(to[0] != -1 && to[2] != -1){
      G[to[0]].push_back(to[2]);
    }
  }
  map<int, int> m;
  int tmp = 0;
  for (int i = 0; i < N; i++) {
    if(uf.find(i) == i){
      m[i] = tmp;
      tmp++;
    }
  }
  vector<vector<int>> H(tmp);
  for (int i = 0; i < N; i++) {
    for(int j : G[i]){
      if(uf.same(i, j)){
        cout << "NO\n";
        exit(0);
      }else{
        H[m[uf.find(i)]].push_back(m[uf.find(j)]);
        H[m[uf.find(j)]].push_back(m[uf.find(i)]);
      }
    }
  }

  vector<int> color(tmp, -1);
  for (int i = 0; i < tmp; i++) {
    if(color[i] == -1){
      queue<int> q;
      color[i] = 1;
      q.push(i);
      while (!q.empty()) {
        int now = q.front();
        q.pop();
        for (int to : H[now]) {
          if (color[to] == -1) {
            color[to] = 1 - color[now];
            q.push(to);
          } else if (color[to] == color[now]) {
            cout << "NO\n";
            exit(0);
          }
        }
      }
    }
  }
  cout << "YES\n";
  return 0;
}
/*
  File : ~/yukicoder/528/E.cpp
  Date : 2025/02/21
  Time : 22:31:48
*/