// Slower C++ solution:
#include <bits/stdc++.h>





using namespace std;



vector<vector<int>> vec(100007);

int n;



long long meme[100007][5];





long long solve(int index, int flag){

    if(index==n){

        return 0;

    }

    

    long long &res = meme[index][flag]; 

    

    if(res != -1){

        return res;

    }

    res = 0;

    

    if(flag!=0){

        res = max(res,vec[index][0]+solve(index+1,0));

    }

    if(flag!=1){

        res =  max(res,vec[index][1]+solve(index+1,1));

    }

    if(flag!=2){

        res =  max(res,vec[index][2]+solve(index+1,2));

    }

    return res;

}



int main(){

    cin>>n;

    int num1,num2,num3;

    memset(meme,-1,sizeof(meme));

    for(int i = 0 ; i<n ; i++){

        cin>>num1>>num2>>num3;

        vec[i].push_back(num1);

        vec[i].push_back(num2);

        vec[i].push_back(num3);

    }

    long long sol = solve(0,3);

    cout<<sol<<endl;

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.8812570207069288x):
/**

 * @author      : Luis Miguel Baez <es.luismiguelbaez@gmail.com>

 * @created     : Thursday August 13, 2020

 */



#include <bits/stdc++.h>



using namespace std;



#define endl '\n'

#define all(x) (x).begin(), (x).end()

#define rall(x) (x).rbegin(), (x).rend()

#define ms(arr, value) memset(arr, value, sizeof arr)

#define ll    int64_t



#define pii   pair<int, int>

#define piii  tuple<int, int, int>

#define pll   pair<ll, ll>

#define plll  tuple<ll, ll, ll>



#define F  first

#define S  second



const int oo  = (int)(1e9);

const ll lloo  = (ll)(1e18);



const int N = int(1e5) + 10;



class Task {

public:



    int n;

    vector<piii> A;



    ll dp[N][4];





    ll go(int index, int last) {

        if(index > n) return 0LL;

        ll &ans = dp[index][last];

        if(ans != -1) return ans;

        ll x=0, y=0;

        if(last == 1) {

            x = get<1>(A[index]) + go(index+1, 2);

            y = get<2>(A[index]) + go(index+1, 3);

        } else if(last == 2) {

            x = get<0>(A[index]) + go(index+1, 1);

            y = get<2>(A[index]) + go(index+1, 3);

        } else if(last == 3) {

            x = get<0>(A[index]) + go(index+1, 1);

            y = get<1>(A[index]) + go(index+1, 2);

        } else {

            ll z = 0;

            x = get<0>(A[index]) + go(index+1, 1);

            y = get<1>(A[index]) + go(index+1, 2);

            z = get<2>(A[index]) + go(index+1, 3);

            x = max(x, z);

        }

        ans = max(x, y);

        return ans;

    }



    ll solveOne(istream &in, ostream &out) {

        int a, b, c;

        in >> n;

        A.resize(n+1);

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

            in >> a >> b >> c;

            A[i] = {a, b, c};

        }

        memset(dp, -1, sizeof dp);

        ll ans = go(1, -1);

        return ans;  

    }

    

    void solve(istream &in, ostream &out) {

        int t = 1;

        while(t--) {

            out << solveOne(in, out) << endl;

        }

    }

};



auto main() -> int {

    ios_base::sync_with_stdio(false);

    cin.tie(NULL);

    cout.tie(NULL);

    

    Task solver;

    istream &in(cin);

    ostream &out(cout);

    solver.solve(in, out);

    return 0;

}