#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int dp[101][101];
int table[101][101];

const int INF = 100000000;

int main(){

	for(int i = 0; i < 101; i++){
		fill(table[i],table[i]+101,INF);
		fill(dp[i],dp[i]+101,0);
	}

	string str;
	int depth=0;
	while(getline(cin,str)){
		int idx=0;
		for(int i = 0; i < str.size(); i++){
			if(str[i]>='0'&&str[i]<='9'){
				for(int j = i+1; j <= str.size(); j++){
					if(j==str.size()||!(str[j]>='0'&&str[j]<='9')){
						table[depth][idx]=atoi(str.substr(i,j-i).c_str());
						idx++;
						i=j;
						break;
					}
				}
			}
		}
		depth++;
	}

	dp[0][0]=table[0][0];
	for(int i = 1; i < depth; i++){
		int wide;
		if((depth/2)>=i){
			wide=i+1;
		}
		else{
			wide=depth-i;
		}


		if((depth/2)>=i){
			for(int j = 0; j < wide; j++){
				if(j-1>=0){
					dp[i][j]=max(dp[i][j],dp[i-1][j-1]+table[i][j]);
				}
				if(table[i-1][j]!=INF){
					dp[i][j]=max(dp[i][j],dp[i-1][j]+table[i][j]);
				}
			}
		}
		else{
			for(int j = 0; j < wide; j++){
				dp[i][j]=max(dp[i][j],dp[i-1][j]+table[i][j]);
				if(table[i-1][j+1]!=INF){
					dp[i][j]=max(dp[i][j],dp[i-1][j+1]+table[i][j]);
				}
			}

		}
	}
	cout<<dp[depth-1][0]<<endl;

	return 0;
}