#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <map>
#include <stack>
#include <string>
#include <sstream>
#include <cstring>
#include <cstdlib>

using namespace std;

#define ALL(c) c.begin(),c.end()
#define RALL(c) c.rbegin(),c.rend()
#define REP(type,i,n) for(type i=0;i<(n);++i)
#define MP(a,b) make_pair((a),(b))

typedef long long int lli;
typedef pair<int,int> P;

const int INF=100000000;
const long long int INF_=1000000000000000000;

lli Gcd(lli a,lli b){
	if(b==0) return a;
	return Gcd(b,a%b);
}

lli Lcm(lli a,lli b){
	return a/Gcd(a,b)*b;
}

class Bar{
	public:
	int p,q,r,b,parent;
	bool exists,is_leaf;
	Bar():parent(-1),exists(false),is_leaf(false){}
	void Init(int a,int b,int c,int d,bool e);
};

void Bar::Init(int a,int bb,int c,int d,bool e){
	p=a; q=bb; r=c; b=d; exists=e;
}

int Find(vector<Bar> &m,int n){
	if(m[n].parent==-1) return n;
	return Find(m,m[n].parent);
}

void Pre(vector<Bar> &m,int n){
	if(m[n].r==-1&&m[n].b==-1){
		m[n].is_leaf=true;
		return;
	}
	if(m[n].r!=-1) Pre(m,m[n].r);
	if(m[n].b!=-1) Pre(m,m[n].b);
}

lli DFS(const vector<Bar> &m,int n){
	if(m[n].is_leaf) return Lcm(m[n].p,m[n].q)/m[n].p+Lcm(m[n].p,m[n].q)/m[n].q;
	lli a,b;
	if(m[n].r==-1) a=Lcm(m[n].p,m[n].q)/m[n].p;
	else a=DFS(m,m[n].r);
	if(m[n].b==-1) b=Lcm(m[n].p,m[n].q)/m[n].q;
	else b=DFS(m,m[n].b);
	return a*Lcm(a*m[n].p,b*m[n].q)/(m[n].p*a)+b*Lcm(a*m[n].p,b*m[n].q)/(m[n].q*b);
}

int main(){
	int N;
	while(cin >> N&&N){
		vector<Bar> mobile(100);
		REP(int,i,N){
			int p,q,r,b;
			cin >> p >> q >> r >> b; //p:q,左の棒の番号、右の棒の番号
			--r;
			--b;
			mobile[i].Init(p,q,r,b,true);
			if(r!=-1) mobile[r].parent=i;
			if(b!=-1) mobile[b].parent=i;
		}
		int parent=-1;
		REP(int,i,100){
			if(mobile[i].exists){
				parent=Find(mobile,i);
				break;
			}
		}
		Pre(mobile,parent);
		lli ans=DFS(mobile,parent);
		cout << ans << endl;
	}
	return 0;
}