#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define sz(v) ((int)((v).size()))
#define debug(x) cout << #x << " = " << x << '\n'
#define Seif ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define fi(name) freopen(name ,"r",stdin)
#define fo(name) freopen(name ,"w",stdout)
const double PI = acos(-1);
const double EPS = 1e-9;
const int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};
const int dy[] = {1, 0, -1, 0, 1, -1, 1, -1};
const int INF = 2e9+17;
const int mod = 1000000007;
const int N = 1e6+17;
const int SQ = 320; //3e4(175), 1e5(320), 2e5(450)

void solve()
{
    int n; cin >> n;
    vector<vector<int>> a(n);
    for (int i=0; i<n; i++) {
        int k; cin >> k;
        while (k--) {
            int x; cin >> x;
            a[i].pb(x);
        }
        sort(all(a[i]));
    }

    ll original = 0;
    vector<int> mex(n), gain(N);

    for (int i=0; i<n; i++) {

        int m1 = 0, idx = 0;
        while (idx < sz(a[i]) && a[i][idx]<=m1) {
            if (a[i][idx] == m1) m1++;
            idx++;
        }

        mex[i] = m1;

        int upMex = m1+1;

        while (idx < sz(a[i]) && a[i][idx]<=upMex) {
            if (a[i][idx] == upMex) upMex++;
            idx++;
        }

        gain[mex[i]] += upMex - mex[i];
        original += mex[i];
    }



    ll ans = 0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<sz(a[i]); j++) {
            int x = a[i][j];
            bool unique = (!j || a[i][j-1]!=x) && (j+1>=sz(a[i]) || a[i][j+1]!=x);

            ans += 1LL * (n-1) * original + gain[x];
            if (x < mex[i] && unique) ans -= 1LL * (n-1) * (mex[i]-x);
        }
    }

    cout << ans << '\n';
}


signed main() {
#if !ONLINE_JUDGE
    fi("input.txt");
    fo("output.txt");
#endif

    Seif;

    int tc; cin >> tc; while (tc--)
    solve();

    return 0;
}
