// Slower C++ solution:
#include <iostream>

#include <algorithm>

#include <cmath>

#include <cstdlib>

#include <cstdio>

#include <cstring>

#include <iomanip>

#include <string>

#include <set>

#include <vector>

#include <queue>

#include <stack>

#include <map>

using namespace std;

#define ms(a, x) memset(a, x, sizeof(a))

#define fore(i, a, n) for (long long i = a; i < n; i++)

#define ford(i, a, n) for (long long i = n - 1; i >= a; i--)

#define si(a) scanf("%d", &a)

#define sl(a) scanf("%lld", &a)

#define sii(a, b) scanf("%d%d", &a, &b)

#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)

#define sll(a, b) scanf("%lld%lld", &a, &b)

#define slll(a, b, c) scanf("%lld%lld%lld", &a, &b, &c)

#define debug(a) cout << a << endl

#define pr(a) printf("%d ",a)

#define endl '\n'

#define pi acos(-1.0)

#define tr t[root]

#define lson t[root << 1]

#define rson t[root << 1 | 1]

#define IO ios::sync_with_stdio(false), cin.tie(0)

#define ull unsigned long long

const double eps = 1e-8;

inline int sgn(const double &x) { return x < -eps ? -1 : x > eps; }

typedef long long ll;

const int inf=0x3f3f3f3f;

const int MAXN = 1e5 + 10;

int n,a[MAXN],b[MAXN],c[MAXN];

ll dp[MAXN][3];

int main()

{

	si(n);

	for(int i=1;i<=n;++i)

	{

		siii(a[i],b[i],c[i]);

	}

	for(int i=1;i<=n;++i)

	{

		dp[i][0]=max(dp[i-1][1]+a[i],dp[i-1][2]+a[i]);

		dp[i][1]=max(dp[i-1][0]+b[i],dp[i-1][2]+b[i]);

		dp[i][2]=max(dp[i-1][1]+c[i],dp[i-1][0]+c[i]);

	}

	ll ans=max(dp[n][0],max(dp[n][1],dp[n][2]));

	printf("%lld\n",ans);

 } 

// Faster C++ solution for the same problem (measured speedup: 5.127870188424865x):
#include<stdio.h>

#include<stdlib.h>



#define get(a, i, j) *((*(a+i))+j)





typedef long long ll;



//long long **mem, **util, N;

ll mem[100001][3], util[100001][3], N;



ll dp(ll d, ll u);



int main()

{

    //freopen("input.txt", "r", stdin);



    ll i, max, temp_util;



    //util = (ll**) malloc(N * sizeof(ll*));

    //mem = (ll**) malloc(N * sizeof(ll*));



    scanf("%lld", &N);



    for(i = 0; i<N; ++i){

        //*(util+i) = (ll*) malloc(3 * sizeof(ll));

        //*(mem+i) = (ll*) calloc(3, sizeof(ll));



        scanf("%lld%lld%lld", &get(util, i, 0), &get(util, i, 1), &get(util, i, 2));

    }





    //printf("%lld\n", dp(0, 0));

    max = 0;

    temp_util = 0;



    for(i = 0; i<3; ++i){

        //printf("calling dp(const 0, %lld)\n", i);

        temp_util = dp(0, i);

        if (max < temp_util) max = temp_util;

    }



    printf("%lld\n", max);



    return 0;

}





ll dp(ll d, ll u)

{

    //printf("inside dp with d = %lld, u = %lld\n", d, u);

    if (d == N-1) {

        //printf("returning %lld without setting\n\n", get(util, d, u));

        return get(util, d, u);

    }



    if(get(mem, d, u) > 0) {

        //printf("returning %lld without setting\n\n", get(util, d, u));

        return get(mem, d, u);

    }



    ll i, max, temp_util;



    max = 0;

    temp_util = 0;

    for(i = 0; i<3; ++i){

        if(i!=u) temp_util = dp(d+1, i);

        if(temp_util>max) max = temp_util;

    }



    //printf("setting value in mem[%lld][%lld] = %lld (%lld)\n\n", d, u, get(util, d, u)+max, get(util, d, u));

    return get(mem, d, u) = get(util, d, u) + max;

}