#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
using namespace std;
#define rep(i, j) for(int i = 0; i < j; i++)
#define f(i, k, j) for(int i = k; i < j; i++)
#define P pair<int, int>
const int INF = (1 << 26);
const int MAX_N = 101;
//void disp();
int dp[MAX_N][MAX_N], n;

int main(){
    string tmp;
    n = 0;
    vector< vector<int> > vec(MAX_N, vector<int>(MAX_N, 0));
    while(getline(cin, tmp)){
        int cnti = 0;
        rep(i, tmp.size()){
            if(tmp[i] != ','){
                vec[n][cnti] = tmp[i] - '0';
                cnti++;
            }
        }
        n++;
    }
//    rep(i, n){
//        rep(j, 15){
//            cout <<vec[i][j] <<", ";
//        } 
//        cout <<endl;
//    }

    memset(dp, 0, sizeof(dp));
    dp[0][0] = vec[0][0];

    int i = 0;
    for( ; i <= n / 2; i++){
        rep(j, MAX_N - 1){
            //cout <<"! " <<i <<", " <<j <<endl;
            dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + vec[i + 1][j]);
            //cout <<i <<", " <<j <<", " <<dp[i + 1][j + 1] <<", " <<dp[i][j] <<", " <<vec[i + 1][j + 1] <<endl;
            dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + vec[i + 1][j + 1]);
//            disp();
        }
    }
    for( ; i < n; i++){
        rep(j, MAX_N - 1){
            //cout <<"? " <<i <<", " <<j <<endl;
            dp[i][j] = max(dp[i][j], max(dp[i - 1][j] + vec[i][j], dp[i - 1][j + 1] + vec[i][j]));
//            disp();
        }
    }

    cout <<dp[n - 1][0] <<endl;
//    rep(i, n){
//        rep(j, 15){
//            cout <<dp[i][j] <<", ";
//        }
//        cout <<endl;
//    }

    return 0;
}

//void disp(){
//    rep(i, n){
//        rep(j, 15){
//            cout <<dp[i][j] <<", ";
//        }
//        cout <<endl;
//    }
//    cout <<endl;
//}