#include <bits/stdc++.h>
using namespace std;
#define all(c) (c).begin(),(c).end()
#define rep(i,n) for(int i=0; i<(int)(n); i++)
#define iter(c) __typeof((c).begin())
#define tr(it,c) for(iter(c) it=(c).begin(); it!=(c).end(); it++)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define pr(a) cout << (a) << endl
typedef long long ll;
typedef pair<int,int> P;
const int MAX=1000000000;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};

int main() {
  vector<vector<int> > v;
  string s;
  int d=0;
  while(cin >> s) {
    s+=',';
    int a=0;
    vector<int> w;
    for(int i=0; i<s.size(); i++) {
      if(s[i]==',') {
	w.pb(a);
	a=0;
      } else {
	a*=10;
	a+=(int)s[i]-'0';
      }
    }
    v.pb(w);
    d=max(d,(int)w.size());
  }
  int dp[v.size()][d];
  memset(dp,0,sizeof(dp));
  dp[0][0]=v[0][0];
  for(int i=0; i<v.size()-1; i++) {
    for(int j=0; j<v[i].size(); j++) {
      if(i<v.size()/2) {
	dp[i+1][j]=max(dp[i+1][j],dp[i][j]+v[i+1][j]);
	dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+v[i+1][j+1]);
      } else {
	if(j-1>=0) dp[i+1][j-1]=max(dp[i+1][j-1],dp[i][j]+v[i+1][j-1]);
	if(j<v[i+1].size()) dp[i+1][j]=max(dp[i+1][j],dp[i][j]+v[i+1][j]);
      }
    }
  }
  pr(dp[v.size()-1][0]);
  return 0;
}
