OI XXXI - tel

// https://szkopul.edu.pl/problemset/problem/sKQFffb5Tfi4po8H_iA7dJtI/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long

#define ar std::array

constexpr int sizik = 5 * 100 * 1001;

std::vector<int> kra[sizik];
std::set<ar<int, 2>> ans;
int dkn[sizik];

bool visited[sizik];

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);

    int n;
    std::cin >> n;

    if (n == 1) {
        std::cout << "1\n1\n";
        return 0;
    }

    std::map<std::set<int>, std::vector<int>> m;

    for (int i = 1; i <= n; i++) {
        int k;
        std::cin >> k;

        std::set<int> s;
        s.insert(i);

        for (int j = 0; j < k; j++) {
            int a;
            std::cin >> a;

            s.insert(a);
            kra[i].push_back(a);
        }

        m[s].push_back(i);
    }

    int cnt = 1;
    for (const auto& [a, b] : m) {
        for (const auto& c : b) {
            dkn[c] = cnt;
        }

        cnt++;
    }

    m.clear();

    cnt--;

    if (cnt == 1) {
        std::cout << "2\n";
        std::cout << "1 ";
        for (int i = 0; i < n - 1; i++) {
            std::cout << "2 ";
        }
        std::cout << '\n';
        std::cout << "1 2\n";
        return 0;
    }

    for (int i = 1; i <= n; i++) {
        int b = dkn[i];
        for (const auto& a : kra[i]) {
            int c = dkn[a];

            if (b != c) {
                if (b < c) {
                    ans.insert({b, c});
                }
            }
        }
    }

    std::cout << cnt << '\n';
    for (int i = 1; i <= n; i++) {
        std::cout << dkn[i] << " ";
    }
    std::cout << '\n';
    for (const auto& [a, b] : ans) {
        std::cout << a << " " << b << '\n';
    }
    std::cout << '\n';

    return 0;
}