#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> P;
typedef map<int,int> M;
typedef vector<int> V;
#define INF (int)(1e9)
#define MAXX 999999
#define EPS (1e-7)
#define MOD ((ll)1e9+7)
#define rep(i,n) for(int i=0; i<(int)(n);i++)
#define REP(i,n) for(int i=1;i<=(int)(n);i++)
#define FOR(i,k,n) for(int i=(k);i<(int)(n);i++)
#define ALL(a)  a.begin(),a.end()
#define RALL(a) a.begin(),a.end(),greater<int>()
#define ROT(a) a.begin(),a.begin()+1,a.end()
#define RROT(a) a.begin(),a.end()-1,a.end()
#define PB push_back
#define MP make_pair
#define PI acos(-1.0)
/*--------------------------------------------*/
/*
int dx[4]={-1,0,1,0};//四方に移動
int dy[4]={0,-1,0,1};
*/
/*--------------------------------------------*/
/*--------------------------------------------*/
/*
ll factorial(ll n){
    if(n==1)return 1;
    return n*factorial(n-1);
}
//
ll memo[MAXX];
ll factorial_memo(long int n){
    if(memo[n]!=0)return memo[n];
    if(n==1)return memo[n]=1;
    return memo[n]=n*factorial_memo(n-1);
}
//
ll lcm(ll A, ll B) {//最小公倍数
    ll a=A;
    ll b=B;
    if (a==0 || b==0) {return 0;}
    if (a<0) {a=-a;}
    if (b<0) {b=-b;}
    while(b>0) {
        ll c=a%b;
        a=b;
        b=c;
    }
    return A/a*B;
}

ll gcd(ll a,ll b){
    while(b!=0) {
        int t=b;
        b=a%b;
        a=t;
    }
    return a;
}

//入力はすべて正とする
bool is_prime(int n) {//素数判定o(√n)
    for (int i=2;i*i<=n;i++){
        if(n%i==0)return false;
    }
    return n!=1;//1の場合は例外
}

vector<ll> divisor(ll n){//約数の列挙o(√n)
    vector<ll> res;
    for(ll i=1;i*i<=n;i++) {
        if(n%i == 0){
        res.push_back(i);
        if(i!=n/i)res.push_back(n/i);
        }
    }
    return res;
}//vector<ll>k=divisor(n);rep(i,k.size())cout<<k[i]<<endl;//のように使う

map<ll,ll> prime_factor(ll n){//素因数分解o(√n)
    map<ll,ll>res;    
    for(ll i=2;i*i<=n;i++) {
        while (n%i==0) { 
            ++res[i];
            n/=i;
        }
    }
    if (n!=1)res[n]=1;
    return res;
}//map<ll,ll> k=prime_factor(n);for(auto i=k.begin();i!=k.end();i++){cout<<i->first<<" "<<i->second<<endl;}//みたいに使う

vector<ll> prime_list(ll n){//n以下の素数を全て見つける
    vector<ll> is_prime(n);//is_prime[i]が1ならiは素数
    for(ll i=2;i<=n;i++)is_prime[i]=1;//最初はみんな素数かも
    for(ll i=2;i*i<=n;i++){//素数の整数倍を消していく(√nまで)
        if(is_prime[i]){
            for(ll j=2*i;j<=n;j++){
                if(j%i==0){
                    is_prime[j]=0;                
                }
            }
        }
    }return is_prime;
}//vector<ll>k=prime_list(n);REP(i,n){if(k[i])cout<<i<<endl;}のように使う
*/
/*--------------------------------------------*/
/*int memo[MAXX];
int fib1(int n){//メモ化再帰
    if(memo[n]!=0)return memo[n];//求値済みなら再利用
    if(n<=1)return n;//終了条件
    memo[n]=fib1(n-1)+fib1(n-2);//終了でないなら再帰式
    return memo[n];
}*/

/*int dp[MAXX];
int fib2(int n){//Dynamic Pragramming
    dp[0]=0;dp[1]=1;//初期化
    //漸化式を作ってDP
    for(int i=2;i<=n;i++){//簡単なほうから複雑なほうに進んでいく
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}*/
/*--------------------------------------------*/

int main(){
    //初DP行くぞ!
    int n;cin>>n;
    vector<vector<int>>a(n,vector<int>(3));//a,b,cのつもり
    rep(i,n){
        rep(j,3){
            cin>>a[i][j];//i日め(0-indexに注)にj番を選んだときの幸福度
        }
    }
    //履歴が要るのでdp二次元配列
    int dp[99999][3];//dp[i][j]とは，"真に"i日目までに，前日にj番の活動を選んだ時の幸福度のmaxである。0-indexではないことに注
    rep(i,n+1){//n日目も調べるので
        rep(j,3){
            dp[i][j]=-INF;//最大値問題なので-INF?で初期化(0でもいい？)
        }
    }
    rep(i,3){
        dp[0][i]=0;//初期条件
    }
    REP(i,n){//i=0は除外(初期で格納済み)
        rep(j,3){//前回選んだ活動
            rep(k,3){//今回選んだ活動
                if(j==k)continue;//連続したらダメ
                dp[i][k]=max(dp[i][k],dp[i-1][j]+a[i-1][k]);
                //printf("dp[%d][%d]=%d\n",i,k,dp[i][k]);
            }
        }
    }
    int ans=max(max(dp[n][0],dp[n][1]),dp[n][2]);
    cout<<ans<<endl;
}




Measured memory_bytes: 6912