#include<iostream>
#include<string>
using namespace std;
#define MAX_N 100

int dp[2][MAX_N + 1], m = 0;

void resetDp();
void setdp();
void next();
void disp();
void up(int cnt);
void down(int cnt);
void dispAns();

int main(){
    resetDp();
    cin >>dp[0][0];
    setdp();
    dispAns();
    return 0;
}

void resetDp(){
    for(int i = 0; i <= MAX_N; i++){
        dp[0][i] = 0;
        dp[1][i] = 0;
    }
}

void setdp(){
    string tmp;
    while(true){
        cin >>tmp;
//        cout <<tmp <<endl;
        int cnt = 0;
        for(int i = 0; i < tmp.size(); i++){
            if(tmp[i] != ','){
                dp[1][cnt] = tmp[i] - '0';
                cnt++;
            }
        }
        if(m < cnt){
            m = cnt;
            up(cnt);
        }else if(m > cnt){
            down(cnt);
            if(cnt == 1) break;
        }
//        disp();
        

        next();
    }
}

void next(){
    for(int i = 0; i <= MAX_N; i++) dp[0][i] = dp[1][i];
}

void disp(){
    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 10; j++){
            cout <<dp[i][j] <<" ";
        }
        cout <<endl;
    }
}

void up(int cnt){
    for(int i = 0; i < cnt; i++){
        if(i - 1 < 0) dp[1][i] += dp[0][i];
        else dp[1][i] += max(dp[0][i], dp[0][i - 1]);
    }
}

void down(int cnt){
    for(int i = 0; i < cnt; i++){
        dp[1][i] += max(dp[0][i], dp[0][i + 1]);
    }
}

void dispAns(){
    int max = -1;
    for(int i = 0; i <= MAX_N; i++){
        if(max < dp[1][i]) max = dp[1][i];
    }
    cout <<max <<endl;
}