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

using namespace std;

typedef long long ll;

typedef long long int lli;

typedef long double ld;

const int oo = 1e9;

//const int mod = 1e9+9;

/*ll gcd(ll x, ll y){return (y ? gcd(y, x%y) : x); }

*ll lcm(ll x, ll y){return x*(y/gcd(x,y));}

*void exEuclid(int a, int b){

	if(b==0){x = 1; y=0; d=a; return ;}

	exEuclid(b, a%b);

	int x1=y;

	int y1=x-(a/b)*y;

	x=x1; 100000

	y=y1;

} 

* */

//===========================================================//

int n;

const int nx = 1e5+5;

int ac[nx][3];

int dp[3][nx];

int go(int a, int i){

	if(i == n) return 0;

	if(dp[a][i] != -1) return dp[a][i];

	int& ans = dp[a][i];

	

	if(a==0){

		ans=max(ans, go(1, i+1)+ac[i][0]);

		ans=max(ans, go(2, i+1)+ac[i][0]);

	}

	if(a==1){

		ans=max(ans, go(0, i+1)+ac[i][1]);

		ans=max(ans, go(2, i+1)+ac[i][1]);

	}

	if(a==2){

		ans=max(ans, go(0, i+1)+ac[i][2]);

		ans=max(ans, go(1, i+1)+ac[i][2]);

	}

	

	return ans;

}

int main(){

	cin>>n;

	for(int i=0; i<n; i++) cin>>ac[i][0]>>ac[i][1]>>ac[i][2];

	memset(dp, -1, sizeof dp);

	cout<<max(go(0,0),max(go(1,0),go(2,0)))<<"\n";

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.187482903496222x):
#include <iostream>

#include <string>

#include<iomanip>

#include <algorithm>

#include <map>

#include <vector>

#include<queue>

#include<math.h>

#include<cmath>

#include<sstream>

#include<set>

#include <map>

#include<string.h>

#include<sstream>

#include<stack>

#include<unordered_map>

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <cstdio>

#include <cstdlib>

#include <complex>

#define ll long long

#define  point complex<double>

#define  pi acos(-1)

#define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define arr2dof vector  vector<vector<int>>dp(N,vector<int>(2, inf));

using namespace std;

const ll N = 2e5 + 5, mod = 1e9 + 7, inff = -1e12,inf=1e12;

const double ep = 0.0000000001;

//const double pi = 3.14159265359;



double dot(point a, point b) {

	return  (conj(a)*b).real();

}

double cross(point a, point b) {

	return  (conj(a)*b).imag();

}

double angle(point a, point b)

{

	double dt = dot(a, b);

	dt /= abs(a);

	dt /= abs(b);

	return acos(dt) * 180.0 / pi;

}



bool isrightangel(int ind) {//90 degree

	vector<point>v;

	return(angle(v[ind] - v[(ind + 1) % 3], v[ind] - v[(ind + 2) % 3]) == 90);//bshof hal eldot producty3ny fe

	//dl3en 3moden 3ashn yb2a right trinagle

}



ll fact[1000006], inv[1000006];



ll fp(ll base, ll exp)

{

	if (exp == 0)

		return 1;

	ll ans = fp(base, exp / 2);

	ans = (ans * ans) % mod;

	if (exp % 2 != 0)

		ans = (ans * (base % mod)) % mod;

	return ans;

}



void calcFacAndInv(ll n)

{

	fact[0] = inv[0] = 1;

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

	{

		fact[i] = (i * fact[i - 1]) % mod;

		inv[i] = fp(fact[i], mod - 2);

	}

}



ll ncr(ll n, ll r)

{

	return ((fact[n] * inv[r]) % mod * inv[n - r]) % mod;

}



ll npr(ll n, ll r)

{

	return (fact[n] * inv[n - r]) % mod;

}













	int dpa[100005], dpb[100005], dpc[100005];

int main()

{

	ll n,arr[100005],a,b,c;

	char tmp;

	cin >> n;

	

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

		cin >> dpa[i] >> dpb[i] >> dpc[i];

	}

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

		dpa[i] += max(dpb[i - 1], dpc[i - 1]);

		dpb[i] += max(dpa[i-1], dpc[i-1]);

		dpc[i] += max(dpb[i-1], dpa[i-1]);

	}

	cout << max(dpa[n - 1], max(dpb[n - 1], dpc[n - 1]));



	return 0;

}