using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static int NN => int.Parse(ReadLine());
    static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
    static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var n = NN;
        var map = NArr(n);
        WriteLine(Order(n, map) ? "YES" : "NO");
    }
    static bool Order(int n, int[][] map)
    {
        var dic = new Dictionary<Bi, List<int>>();
        for (var i = 0; i < map.Length; ++i)
        {
            var b1 = new Bi(map[i][0], map[i][1]);
            if (dic.ContainsKey(b1)) dic[b1].Add(i);
            else dic[b1] = new List<int>() { i };
            var b2 = new Bi(map[i][1], map[i][2]);
            if (dic.ContainsKey(b2)) dic[b2].Add(i);
            else dic[b2] = new List<int>() { i };
            var b3 = new Bi(map[i][0], map[i][2]);
            if (dic.ContainsKey(b3)) dic[b3].Add(i);
            else dic[b3] = new List<int>() { i };
        }
        foreach (var kv in dic)
        {
            if (kv.Value.Count > 2)
            {
                return false;
            }
        }
        var orders = new int[n];
        for (var i = 0; i < n; ++i) if (orders[i] == 0)
        {
            var q = new Queue<(int id, int o)>();
            q.Enqueue((i, 1));
            orders[i] = 1;
            while (q.Count > 0)
            {
                var cur = q.Dequeue();
                var b1 = new Bi(map[cur.id][0], map[cur.id][1]);
                if (dic[b1].Count == 2)
                {
                    var o = Other(dic[b1], cur.id);
                    var nv = orders[cur.id] * (IsFlip(map[cur.id], map[o], b1.A, b1.B) ? -1 : 1);
                    if (orders[o] == 0)
                    {
                        orders[o] = nv;
                        q.Enqueue((o, orders[o]));
                    }
                    else if (orders[o] != nv) return false;
                }
                var b2 = new Bi(map[cur.id][1], map[cur.id][2]);
                if (dic[b2].Count == 2)
                {
                    var o = Other(dic[b2], cur.id);
                    var nv = orders[cur.id] * (IsFlip(map[cur.id], map[o], b2.A, b2.B) ? -1 : 1);
                    if (orders[o] == 0)
                    {
                        orders[o] = nv;
                        q.Enqueue((o, orders[o]));
                    }
                    else if (orders[o] != nv) return false;
                }
                var b3 = new Bi(map[cur.id][0], map[cur.id][2]);
                if (dic[b3].Count == 2)
                {
                    var o = Other(dic[b3], cur.id);
                    var nv = orders[cur.id] * (IsFlip(map[cur.id], map[o], b3.A, b3.B) ? -1 : 1);
                    if (orders[o] == 0)
                    {
                        orders[o] = nv;
                        q.Enqueue((o, orders[o]));
                    }
                    else if (orders[o] != nv) return false;
                }
            }
        }
        return true;
    }
    static bool IsFlip(int[] a, int[] b, int x, int y)
    {
        var ans = true;
        if (a[0] == x && a[2] == y) ans = !ans;
        if (b[0] == x && b[2] == y) ans = !ans;
        return ans;
    }
    static int Other(List<int> list, int a)
    {
        return list[0] == a ? list[1] : list[0];
    }
    class Bi
    {
        public int A;
        public int B;
        public Bi(int a, int b)
        {
            A = a; B = b;
        }
        public override bool Equals(object obj)
        {
            var o = (Bi) obj;
            return A == o.A && B == o.B;
        }
        public override int GetHashCode()
        {
            return (int)((A * 100_000_000L + B) % 1_000_000_007);
        }
    }
}