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