# import bisect

# import copy

# import fractions

# import math

# import numpy as np

# from collections import Counter, deque

# from itertools import accumulate,permutations, combinations,combinations_with_replacement,product



def resolve():

    n=int(eval(input()))



    [A,B,C]=[[0]*n for _ in range(3)]

    for i in range(n):

        A[i],B[i],C[i]=list(map(int,input().split()))



    dp=[[0]*3 for _ in range(n)]



    dp[0]=[A[0],B[0],C[0]]



    for i in range(n-1):

        dp[i+1][0]=max(dp[i][1]+A[i+1],dp[i][2]+A[i+1])

        dp[i+1][1]=max(dp[i][0]+B[i+1],dp[i][2]+B[i+1])

        dp[i+1][2]=max(dp[i][0]+C[i+1],dp[i][1]+C[i+1])



    print((max(dp[n-1])))







resolve()
import sys

sys.setrecursionlimit(10 ** 5 + 10)

def input(): return sys.stdin.readline().strip()



def resolve():

    

    # https://qiita.com/drken/items/dc53c683d6de8aeacf5a#dp-%E5%AE%9F%E8%A3%85%E3%81%AE%E9%A0%86%E5%BA%8F

    

    

    INF = 10**10  # INF+INFを計算してもオーバーフローしない範囲で大きく

    

    N = int(eval(input()))

    L=[list(map(int,input().split())) for i in range(N+1)]

    # dpテーブル dp[i][j]:=i日目にjを行なって得られる幸福度のmax

    W=3

    dp = [[-1]*3 for _ in range(N+1)]

    """

    初期化の値は，

        最小化問題：INF, 

        最大化問題：-INF（0以上の値しか取らないなら-1, あるいは0でもいいかも)

        数え上げ問題：0

        確率問題：0

        Yes/No判定問題:False

    """

    

    # 初期条件

    for j in range(W):

        dp[0][j] = 0

    

    # ループ

    for i in range(1,N+1):

        for j in range(W):

    

            """

            dp[from] の値の更新が完了していればノード from からノード to への緩和を行っていい．貰うdpであれ配るdpであれ．

            両者の違いを意識すべきケースはcf. 

            https://qiita.com/drken/items/ace3142967c4f01d42e9#%E8%B2%B0%E3%81%86-dp-%E3%81%A8%E9%85%8D%E3%82%8B-dp-%E3%81%AE%E6%AF%94%E8%BC%83

    

            # 遷移式がたくさんある場合この中でさらにforループを回したりする cf. https://atcoder.jp/contests/dp/tasks/dp_b

            """

            for k in range(W):

                if j!=k:

                    dp[i][j]=max(dp[i][j],dp[i-1][k]+L[i-1][k])

    

    # 出力

    print((max(dp[N])))

    

    

    

resolve()
# import bisect
# import copy
# import fractions
# import math
# import numpy as np
# from collections import Counter, deque
# from itertools import accumulate,permutations, combinations,combinations_with_replacement,product
def resolve():
    n = int(eval(input()))
    [A, B, C] = [[0] * n for _ in range(3)]
    for i in range(n):
        A[i], B[i], C[i] = list(map(int, input().split()))
    dp = [[0] * 3 for _ in range(n)]
    dp[0] = [A[0], B[0], C[0]]
    for i in range(n - 1):
        dp[i + 1][0] = max(dp[i][1] + A[i + 1], dp[i][2] + A[i + 1])
        dp[i + 1][1] = max(dp[i][0] + B[i + 1], dp[i][2] + B[i + 1])
        dp[i + 1][2] = max(dp[i][0] + C[i + 1], dp[i][1] + C[i + 1])
    print((max(dp[n - 1])))


resolve()

import sys

sys.setrecursionlimit(10**5 + 10)


def input():
    return sys.stdin.readline().strip()


def resolve():
    # https://qiita.com/drken/items/dc53c683d6de8aeacf5a#dp-%E5%AE%9F%E8%A3%85%E3%81%AE%E9%A0%86%E5%BA%8F
    INF = 10**10  # INF+INFを計算してもオーバーフローしない範囲で大きく
    N = int(eval(input()))
    L = [list(map(int, input().split())) for i in range(N + 1)]
    # dpテーブル dp[i][j]:=i日目にjを行なって得られる幸福度のmax
    W = 3
    dp = [[-1] * 3 for _ in range(N + 1)]
    """
    初期化の値は，
        最小化問題：INF, 
        最大化問題：-INF（0以上の値しか取らないなら-1, あるいは0でもいいかも)
        数え上げ問題：0
        確率問題：0
        Yes/No判定問題:False
    """
    # 初期条件
    for j in range(W):
        dp[0][j] = 0
    # ループ
    for i in range(1, N + 1):
        for j in range(W):
            """
            dp[from] の値の更新が完了していればノード from からノード to への緩和を行っていい．貰うdpであれ配るdpであれ．
            両者の違いを意識すべきケースはcf.
            https://qiita.com/drken/items/ace3142967c4f01d42e9#%E8%B2%B0%E3%81%86-dp-%E3%81%A8%E9%85%8D%E3%82%8B-dp-%E3%81%AE%E6%AF%94%E8%BC%83
            # 遷移式がたくさんある場合この中でさらにforループを回したりする cf. https://atcoder.jp/contests/dp/tasks/dp_b
            """
            for k in range(W):
                if j != k:
                    dp[i][j] = max(dp[i][j], dp[i - 1][k] + L[i - 1][k])
    # 出力
    print((max(dp[N])))


resolve()

-# import bisect -# import copy -# import fractions -# import math -# import numpy as np -# from collections import Counter, deque -# from itertools import accumulate,permutations, combinations,combinations_with_replacement,product +import sys + +sys.setrecursionlimit(10**5 + 10) + + +def input(): +    return sys.stdin.readline().strip() + + -    n = int(eval(input())) -    [A, B, C] = [[0] * n for _ in range(3)] -    for i in range(n): -        A[i], B[i], C[i] = list(map(int, input().split())) -    dp = [[0] * 3 for _ in range(n)] -    dp[0] = [A[0], B[0], C[0]] -    for i in range(n - 1): -        dp[i + 1][0] = max(dp[i][1] + A[i + 1], dp[i][2] + A[i + 1]) -        dp[i + 1][1] = max(dp[i][0] + B[i + 1], dp[i][2] + B[i + 1]) -        dp[i + 1][2] = max(dp[i][0] + C[i + 1], dp[i][1] + C[i + 1]) -    print((max(dp[n - 1]))) +    # https://qiita.com/drken/items/dc53c683d6de8aeacf5a#dp-%E5%AE%9F%E8%A3%85%E3%81%AE%E9%A0%86%E5%BA%8F +    INF = 10**10  # INF+INFを計算してもオーバーフローしない範囲で大きく +    N = int(eval(input())) +    L = [list(map(int, input().split())) for i in range(N + 1)] +    # dpテーブル dp[i][j]:=i日目にjを行なって得られる幸福度のmax +    W = 3 +    dp = [[-1] * 3 for _ in range(N + 1)] +    """ +    初期化の値は， +        最小化問題：INF, +        最大化問題：-INF（0以上の値しか取らないなら-1, あるいは0でもいいかも) +        数え上げ問題：0 +        確率問題：0 +        Yes/No判定問題:False +    """ +    # 初期条件 +    for j in range(W): +        dp[0][j] = 0 +    # ループ +    for i in range(1, N + 1): +        for j in range(W): +            """ +            dp[from] の値の更新が完了していればノード from からノード to への緩和を行っていい．貰うdpであれ配るdpであれ． +            両者の違いを意識すべきケースはcf. +            https://qiita.com/drken/items/ace3142967c4f01d42e9#%E8%B2%B0%E3%81%86-dp-%E3%81%A8%E9%85%8D%E3%82%8B-dp-%E3%81%AE%E6%AF%94%E8%BC%83 +            # 遷移式がたくさんある場合この中でさらにforループを回したりする cf. https://atcoder.jp/contests/dp/tasks/dp_b +            """ +            for k in range(W): +                if j != k: +                    dp[i][j] = max(dp[i][j], dp[i - 1][k] + L[i - 1][k]) +    # 出力 +    print((max(dp[N])))