モビールは動く芸術品として広く親しまれている.IOI 日本委員会では,JOI を広報するためにモビールを作成することになった.JOI 広報用モビールは,棒,紐(ひも),錘(おもり)の 3 種類の要素を用いて,次のように構成される.    * 棒の一方の端は青に,もう一方の端は赤に塗られている.    * 棒は両端以外の 1 箇所を支点として紐でつるされる.   * 支点から赤の端までの長さも支点から青の端までの長さも正整数である.   * 棒の両端には,紐で錘か他の棒をつるす.   * 錘は紐を用いてどれかの棒の一端につるされる.   * 錘には何もつるさない.   * 錘の重さは正整数である.   * 紐のうち 1 本だけは,片方の端をある棒をつるすためにその棒の支点に結ばれ, もう一方の端は他のどの構成要素とも結ばれていない.他の紐は全て次のいず れかを満たす.     * ある棒の端とある棒の支点を結ぶ.     * ある棒の端とある錘を結ぶ.  ただし,どの棒においても,バランスが取れている必要がある.棒と紐の重さは無視できるほど軽いので,棒と紐の重さは全て 0 であるとみなして解答せよ.つまり,それぞれの棒について,  (その棒の赤の端より下につるされている錘の重さの総計) × (その棒の支点から赤の端までの長さ) = (その棒の青の端より下につるされている錘の重さの総計) × (その棒の支点から青の端までの長さ)  であるとき,その棒はバランスが取れているとせよ.      どのような長さの棒をどのように結びモビールを構成するかは既に決まっているのだが,錘の重さがまだ決まっていない.モビールは軽い方がつりやすいため, なるべく軽いモビールを作りたい.前述したようにどの棒もバランスを取りながら, モビールの総重量を最小にするような錘の付け方を求め, そのときのモビールの総重量を出力するプログラムを作れ. プログラムには以下のモビールの構成に関する情報が与えられる.    * 棒の本数 n   * 各棒ごとの情報(棒の番号は 1 から n)     * 支点から赤の端までの長さと支点から青の端までの長さの比     * 赤の端につるす棒の番号 (錘をつるす場合は 0)     * 青の端につるす棒の番号 (錘をつるす場合は 0)  
from math import gcd
while True:
  try:
    n = int(input())
    if not n: break
    lst = [[]]
    weight = [-1 for i in range(n + 1)]
    def setWeight(n):
      p,q,r,b = lst[n]
      if weight[n] != -1:pass
      elif r == 0 and b == 0:
        weight[n] = (p + q) // gcd(p,q)
      elif r == 0:
        setWeight(b)
        wb = weight[b]
        g = gcd(wb * q, p)
        lcm = wb * q * p // g
        weight[n] = lcm // q + lcm // p
        print("wr:",str(lcm//p),"wb:",str(wb),"g:",g,"p:",p,"lcm",lcm)
      elif b == 0:
        setWeight(r)
        wr = weight[r]
        g = gcd(wr * p, q)
        lcm = wr * p * q // g
        weight[n] = lcm // p + lcm // q
      else:
        if weight[r] == -1: setWeight(r)
        if weight[b] == -1: setWeight(b)
        wr = weight[r]
        wb = weight[b]
        g = gcd(wr * p, wb * q)
        lcm = wr * p * wb  * q // g
        weight[n] = lcm // p + lcm // q
    for i in range(n):
      lst.append(list(map(int,input().split())))
    for i in range(0,n):
      if weight[i + 1] == -1:
        setWeight(i+1)
    print(max(weight))
    print(weight)
  except EOFError:
    break




from math import gcd
def lcm(i, j):
  return i * j // gcd(i, j)
def main():
  while True:
    n = int(input())
    if not n: break
    lst = [[]]
    weight = [-1 for i in range(n + 1)]
    def setWeight(n):
      p, q, r, b = lst[n]
      if weight[n] != -1: pass
      elif r == 0 and b == 0:
        weight[n] = (p + q) // gcd(p, q)
      elif r == 0:
        setWeight(b)
        l = lcm(weight[b] * q, p)
        weight[n] = l // q + l // p
      elif b == 0:
        setWeight(r)
        l = lcm(weight[r] * p, q)
        weight[n] = l // p + l // q
      else:
        if weight[r] == -1: setWeight(r)
        if weight[b] == -1: setWeight(b)
        l = lcm(weight[r] * p, weight[b]  * q)
        weight[n] = l // p + l // q
    for i in range(n):
      lst.append(list(map(int,input().split())))
    for i in range(0, n):
      if weight[i + 1] == -1:
        setWeight(i + 1)
    print(max(weight))

if __name__ == '__main__':
  main()
