#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
#define pb push_back
#define INF 1e15
int n;
int main(){
	while(1){
		ll lcm[105]={};
	vector<ll> son[105];
	P stick[105];
	bool decide[105]={};
	bool beleft[105]={},beright[105]={};
	scanf("%d",&n);
	if(!n) break;
	for(int q=1;q<=n;q++){
		ll a,b,c,d;
		scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
		if(c){
			son[q].pb(c);
			beleft[q]=true;
		}
		if(d){
			son[q].pb(d);
			beright[q]=true;
		}
		ll rp;
		for(int i=min(a,b);i>=1;i--){
			if(a%i==0 && b%i==0){
				rp=((a/i)+(b/i));
				stick[q]=make_pair(a/i,b/i);
				break;
			}
		}
		lcm[q]=rp;
		if(son[q].size()==0){
			decide[q]=true;
		}
	}
	int last=1;
	while(1){
		bool p=false;
	for(int i=1;i<=n;i++){
		if(son[i].size()!=0 && !decide[i]){
			int cou=0;
			for(int j=0;j<son[i].size();j++){
				if(decide[son[i][j]]){
					cou++;
				}
			}
			if(cou==son[i].size()){
					ll maxi1=0,maxi2=0;
					if(beleft[i]){
						for(int g=min(stick[i].second,lcm[son[i][0]]);g>=1;g--){
							if(stick[i].second%g==0 && lcm[son[i][0]]%g==0){
								maxi1=(lcm[son[i][0]]/g*(stick[i].first+stick[i].second));
								break;
							}
						}
					}
					if(beright[i]){
						for(int g=min(stick[i].first,lcm[son[i][son[i].size()-1]]);g>=1;g--){
							if(stick[i].first%g==0 && lcm[son[i][son[i].size()-1]]%g==0){
								maxi2=lcm[son[i][son[i].size()-1]]/g*(stick[i].first+stick[i].second);
								break;
							}
						}
					}
					if(maxi1 && !maxi2){
						lcm[i]=maxi1;
					}else if(!maxi1 && maxi2){
						lcm[i]=maxi2;
					}else{
						for(int q=min(maxi1,maxi2);q>=1;q--){
							if(maxi1%q==0 && maxi2%q==0){
								lcm[i]=maxi1*maxi2/q;
								break;
							}
						}
					}
					decide[i]=true;
					last=i;
					p=true;
			}
		}
	}
	if(!p){
		break;
	}
	}
	printf("%lld\n",lcm[last]);
}
}