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