#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <map> 
#include <string>
#include <vector>  
#include <iostream> 
#include <sstream> 
#include <queue>
#include <algorithm>
#include <assert.h>
#include <iomanip> 


using namespace std;

#define ll long long
#define PB 		push_back
#define FOR(a,start,end) 	for(int a=int(start); a<int(end); a++)
#define INF 		INT_MAX
#define SORT(a) 	sort(a.begin(),a.end()) 
#define CL(a,x) 		memset(a,x,sizeof(a))
#define REP(a,x)	for(int a=0;a<x;a++)
#define REP1(a,x)	for(int a=1;a<=x;a++)
#define MP 		make_pair



typedef vector<ll>     vi;
typedef pair<ll, ll>     pii;
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<ll> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string, string> > vss;
typedef pair<string, string> pss;
typedef pair<ll, pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;


ll  n, k, q, d, r, g, b, z, p, a, c, m, k1, k2;
char zn;
vs vw, vwk;
string wa, wb;
vi vk, va, vc,vb;
vii vkx, vkx2;
vvi vvk,vva,vvb;
vector<bool> vac;

ll gcd(ll a, ll b) {
	ll k, m;

	if (a > b) {
		k = a;
		a = b;
		b = k;
	}
	k = b % a;
	if (k == 0)
		return a;
	else {
		while (k != 0) {
			m = k;
			b = a;
			a = k;
			k = b % a;
		}
		return m;
	}
}
int main() {
	//freopen("c:\\wojtek\\uva\\pa\\debug\\10.in", "rt", stdin);
	//d = 1000000007;

	//while (1) {

	cin >> n;

	vk.clear();
	vvk.assign(n + 1, vk);
	vva.assign(n + 1, vk);
	vvb.assign(n + 1, vk);
	vkx.assign(n + 1, MP(0, 0));
	vc.assign(n + 1, 0ll);
	va.assign(n + 1, 0ll);
	vb.assign(n + 1, 0ll);
	va[1] = 1;
	vac.assign(n + 1, false);
	vac[1] = true;
	for (int i = 1; i <= n; i++) {
		cin >> k;
		vkx[i].second = k;
		for (int j = 0; j < k; j++) {
			cin >> b;
			vvk[i].push_back(b);
		}
	}
	if (vkx[1].second == 0)
		cout << 1 << endl;
	else {
		/*
		for (int i = 1; i <= n; i++) {
			for (int j = 0; j < (int)vvk[i].size(); j++) {
				vva[vvk[i][j]].push_back(vkx[i].second);
				vvb[vvk[i][j]].push_back(i);
			}
		}
		*/
		
		vc[1] = vkx[1].second;
		vva[1].push_back(1);
		vvb[1].push_back(1);
		for (int i = 1; i <= n; i++) {
			if (vac[i]&&(vkx[i].second > 0)) {
				a = 1;
				k = 1;
				for (int j = 0; j < (int)vva[i].size(); j++) {
					a = gcd(k, vva[i][j]);
					k *= vva[i][j];
					k /= a;
				}
				//k /= a;	//k - nww il.ruchów z dołu 
				//
				va[i] = 0; // łączna il ruchów z dołu na k ruchów
				for (int j = 0; j < (int)vva[i].size(); j++) {
					va[i] += ((k /vva[i][j])* vvb[i][j]) ;
				}
				//

				vc[i] = va[i] * vkx[i].second;//cykl i
				a = gcd(va[i], vkx[i].second);
				vc[i] /= a;
				vc[i] /= va[i];
				vc[i] *= k;

				c=((vc[i] / k)* va[i])/vkx[i].second;	//il do góry na każdą taśme
				//
				for (int j = 0; j < (int)vvk[i].size(); j++) {
					vva[vvk[i][j]].push_back(vc[i]);
					vvb[vvk[i][j]].push_back(c);
					vac[vvk[i][j]] = true;
				}
			}
		}
		z = 1;
		for (int i = 1; i <= n; i++) {
			if (vc[i] > 1) {
				a = gcd(z, vc[i]);
				z = (z * vc[i]) / a;
			}
		}
		cout << z << endl;
	}

	
	//}
// }

	return 0;

}
