#include <algorithm>
#include <iostream>
#include <set>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int Q;
    cin >> Q;
    
    set<int> vertices;
    set<pair<int, int>> edges;
    set<tuple<int, int, int>> faces;
    
    int v_count = 0, e_count = 0, f_count = 0;
    
    while (Q--) {
        int a, b, c;
        cin >> a >> b >> c;
        
        // 处理顶点
        int new_v = 0;
        if (!vertices.count(a)) { vertices.insert(a); new_v++; }
        if (!vertices.count(b)) { vertices.insert(b); new_v++; }
        if (!vertices.count(c)) { vertices.insert(c); new_v++; }
        v_count += new_v;
        
        // 处理边(自动排序)
        auto e1 = make_pair(min(a, b), max(a, b));
        auto e2 = make_pair(min(b, c), max(b, c));
        auto e3 = make_pair(min(c, a), max(c, a));
        
        int new_e = 0;
        if (!edges.count(e1)) { edges.insert(e1); new_e++; }
        if (!edges.count(e2)) { edges.insert(e2); new_e++; }
        if (!edges.count(e3)) { edges.insert(e3); new_e++; }
        e_count += new_e;
        
        // 处理面(全排序)
        int x = min({a, b, c});
        int z = max({a, b, c});
        int y = a + b + c - x - z;
        auto f = make_tuple(x, y, z);
        
        if (!faces.count(f)) {
            faces.insert(f);
            f_count++;
        }
    }
    
    cout << v_count - e_count + f_count << endl;
    return 0;
}