// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int N = 1e5+10 , OO = 0x3f3f3f3f ;

//const int mod = 1000000007;

 

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

double startTime;

double getCurrentTime() {

	return ((double)clock() - startTime) / CLOCKS_PER_SEC;

}

#define clr(arr,val) memset(arr , val , sizeof (arr))

#define loop(i,n) for(int i = 0;i < int(n);i++)

#define rloop(i,n) for(int i = int(n)-1;i >= 0;i--)

#define xloop(i,a,b) for(int i = int(a);i <= int(b);i++)

#define range(vec) for(auto &x : vec) cin >> x;

#define ALL(v) ((v).begin()) , ((v).end())

#define SZ(v)  ((int)((v).size()))

int dx[]={1,0,-1,0};int dy[]={0,1,0,-1}; //4 Direction

//int dx[]={1,1,0,-1,-1,-1,0,1};int dy[]={0,1,1,1,0,-1,-1,-1};//8 direction

//int dx[]={2,1,-1,-2,-2,-1,1,2};int dy[]={1,2,2,1,-1,-2,-2,-1};//Knight Direction

//int dx[6]={2,1,-1,-2,-1,1};int dy[6]={0,1,1,0,-1,-1}; //Hexagonal Direction

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

//freopen("output.txt", "w", stdout);



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

int dp[N][4];



int solve(int idx , int lst){

	

	if(idx == n) return 0;

	int& ret = dp[idx][lst];

	if(~ret) return ret;

	ret = -OO;

	if(lst != 0) // swim

		ret = max(ret , solve(idx+1 , 0) + a[idx]);

	if(lst != 1)

		ret = max(ret , solve(idx+1 , 1) + b[idx]);

	if(lst != 2)

		ret = max(ret , solve(idx+1 , 2) + c[idx]);

		

	return ret;

}





int main()

{

    startTime = (double)clock();

    #ifndef ONLINE_JUDGE

        //freopen("in.in", "r", stdin);

        //freopen("out.in", "w", stdout);

    #endif

	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

	

	cin >> n;

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

		cin >> a[i] >> b[i] >> c[i];



	clr(dp , -1);

	cout << solve(0 , 3) << "\n";





    return 0;

}

// Optimized solution to the same problem (faster):
#include<iostream>

#include<stdio.h>

#include<algorithm>

#include<vector>

#include<cstring>

#include<set>

#include<queue>

#include<map>

#include<math.h>

#include<climits>



#define FASTREAD      ios_base::sync_with_stdio(0);cin.tie(nullptr);

#define ll long long

#define dd double

#define scl(n)        scanf("%lld",&n)

#define scd(n)        scanf("%lf",&n)

#define scc(n)        scanf("%c",&n)

#define scs(n)        scanf("%s",&n)

#define ptl(n)        printf("%lld",n)

#define ptd(n)        printf("%f",n)

#define ptc(n)        printf("%c",n)

#define pts(n)        printf("%s",n)

#define nline         printf("\n")

#define pb            push_back

#define FOR(i,a,b)    for(ll i=a;i<=b;i++)

#define FORr(i,a,b)   for(ll i=a;i>=b;i--)

#define pi            2*acos(0.0)

#define pii           pair<ll,ll>

#define uu            first

#define vv            second



using namespace std;

ll n,a[100005],b[100005],c[100005],dp[100010][3],op0,op1,op2;

int main()

{

    scl(n);

    FOR(i,1,n)

    {

        scl(a[i]);

        scl(b[i]);

        scl(c[i]);

    }

    dp[n][0]=a[n];

    dp[n][1]=b[n];

    dp[n][2]=c[n];

    FORr(i,n-1,1)

    {

        if(i+1<=n)

        {

            op0=dp[i+1][0];

            op1=dp[i+1][1];

            op2=dp[i+1][2];

        }

        else

        {

            op0=LONG_MIN;

            op1=LONG_MIN;

            op2=LONG_MIN;

        }

        dp[i][0]=max(op1+a[i],op2+a[i]);

        dp[i][1]=max(op0+b[i],op2+b[i]);

        dp[i][2]=max(op0+c[i],op1+c[i]);

       // cout<<dp[i][0]<<endl;

    }

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

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

    ptl(ans);

    return 0;

}


// Fastest known solution for this problem: