Buggy python submission (verdict: Time Limit Exceeded):
from functools import reduce
import math

def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]    
    N = int(input())
    C = []
    S = []
    F = []
    for i in range(N-1):
        s1, s2, s3 = (int(_) for _ in input().split())
        C.append(s1)
        S.append(s2)
        F.append(s3)
    ans = []
    for h in range(N-1):
        time = 0
        for i in range(h,N-1):
            if i ==h:
                time=S[i]+C[i]
                continue
            if time <= S[i]:
                time=S[i]+C[i]
            else:
                tmp_t = S[i]
                while time > tmp_t:
                    tmp_t += F[i]
                time = tmp_t +C[i]
        ans.append(time)
    print('\n'.join(str(_) for _ in ans))
    print(0)
    
if __name__ == '__main__':
    main()


Fixed submission:
from functools import reduce
import math

def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]    
    N = int(input())
    C = []
    S = []
    F = []
    for i in range(N-1):
        s1, s2, s3 = (int(_) for _ in input().split())
        C.append(s1)
        S.append(s2)
        F.append(s3)
    ans = []
    for h in range(N-1):
        time = 0
        for i in range(h,N-1):
            if i ==h:
                time=S[i]+C[i]
                continue
            if time <= S[i]:
                time=S[i]+C[i]
            else:
                tmp_t = S[i]
                while time > tmp_t:
                    tmp_t += F[i]
                time = tmp_t +C[i]
        ans.append(time)
    print('\n'.join(str(_) for _ in ans))
    print(0)
    
if __name__ == '__main__':
    main()