#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cmath>
#include <ctime>
#include <vector>
#include <stack>

using namespace std;
////////////////*My library*////////////////////////
#define rep_to(a,i,n) for(int i=a;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define rep_r(i,n) for(int i=n-1;i>=0;i--)
#define debug(x) cout<<x<<endl
#define s_1(x) cin>>x
#define s_2(x,y) cin>>x>>y
////////////////////////////////////////////////////

////////////////////////
/*prime()*/
/*primecount()*/
/*sort()*/
/*imos???*/
/*????????¢?´¢*/
/*??±???????????¢?´¢*/
/*???????¨???????*/
///////////////////////
int max(int a,int b)
{
	if(a>=b)return a;
	else return b;
}
int main()
{
	int i=0,j=0;
	string str;
	char in[100][1000]={};
	vector<int> num[101];

	while(getline( cin, str ))
	{
		int k=0;
		rep(i,str.size())
		{
			if(str[i]!=',')
			{
				num[j].push_back(atoi(&str[i]));
				//k++;
			}
		}
		j++;
	}

	int count=1;
	int dp[101][101]={};
	fill(dp[0],dp[101],0);
	dp[0][0]=num[0][0];
	rep_to(1,i,j)
	{
		if(i<=j/2 && i>=1)
		{
			count++;
			rep(k,num[i].size())dp[i][k]=max(num[i][k]+dp[i-1][k],num[i][k]+dp[i-1][k-1]);
		}
		else 
		{
			count--;
			rep(k,num[i].size())dp[i][k]=max(num[i][k]+dp[i-1][k+1],num[i][k]+dp[i-1][k]);
		}
		//rep(k,num[i].size())cout<<dp[i][k]<<" ";
		//cout<<endl;
	}
	cout<<dp[j-1][0]<<endl;
	return 0;
}