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

class Program
{
    static int NN => int.Parse(ReadLine());
    static long[] NList => ReadLine().Split().Select(long.Parse).ToArray();
    static long[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var q = NN;
        var map = NArr(q);
        var v = new HashSet<long>();
        var e = new HashSet<Bi>();
        var f = new HashSet<Tri>();
        foreach (var elm in map)
        {
            v.Add(elm[0]);
            v.Add(elm[1]);
            v.Add(elm[2]);
            e.Add(new Bi(elm[0], elm[1]));
            e.Add(new Bi(elm[1], elm[2]));
            e.Add(new Bi(elm[0], elm[2]));
            f.Add(new Tri(elm[0], elm[1], elm[2]));
        }
        WriteLine(v.Count - e.Count + f.Count);
    }
    static int mod = 998_244_383;
    class Bi
    {
        long A;
        long B;
        public Bi(long a, long b)
        {
            A = a; B = b;
        }
        public override int GetHashCode()
        {
            return (int)((A * 100_000_000 + B) % mod);
        }
        public override bool Equals(object obj)
        {
            var o = (Bi)obj;
            return A == o.A && B == o.B;
        }
    }
    class Tri
    {
        long A;
        long B;
        long C;
        public Tri(long a, long b, long c)
        {
            A = a; B = b; C = c;
        }
        public override int GetHashCode()
        {
            return (int)(((A * 100_000_000 + B) % mod * 100_000_000 + C) % mod);
        }
        public override bool Equals(object obj)
        {
            var o = (Tri)obj;
            return A == o.A && B == o.B && C == o.C;
        }
    }
}