# load matrix from input
m=[]
while True:
  try:
    s=raw_input()
    if s=='':break
    m.append(map(int,s.split(',')))
  except EOFError:
    break
 
# create work sandbox
# insert rows and cols into original matrix,
# they stand for "edges" between neighborhood matrix cells
# put values (aritmetic mean) on the edges
def sandbox(m):
  my=len(m); mx=len(m[0])
  t=[[float('infinity') for i in range(2*mx-1)] for j in range(2*my-1)]
  t[0][0]=0.0
  # edge values - horizontally
  for i in range(my):
    for j in range(mx-1):
      if i==0 and j==0:
        t[2*i][2*j+1]=m[i][j+1]*0.5+m[i][j]
      elif i==my-1 and j==mx-2:
        t[2*i][2*j+1]=m[i][j+1]+m[i][j]*0.5
      else:
        t[2*i][2*j+1]=(m[i][j+1]+m[i][j])*0.5
  # edge values - vertically
  for i in range(mx-1):#mx
    for j in range(my):
      if i==0 and j==0:
        t[2*i+1][2*j]=m[i+1][j]*0.5+m[i][j]
      elif i==mx-2 and j==my-1:
        t[2*i+1][2*j]=m[i+1][j]+m[i][j]*0.5
      else:
        t[2*i+1][2*j]=(m[i+1][j]+m[i][j])*0.5
  return t

sb=sandbox(m)

def testandset(a,x,y,v):
  if v<a[x][y]:a[x][y]=v

# perform Dijkstra algorithm from top left corner
# of sandbox to diagonal
my=len(m); mx=len(m[0])
for i in range(my-1):
  for j in range(i+1):
    x,y=2*(i-j),2*j
    # horizontal successor
    testandset(sb,x+2,y,sb[x][y]+sb[x+1][y])
    # vertical successor
    testandset(sb,x,y+2,sb[x][y]+sb[x][y+1])

# perform Dijkstra from below-diagonal to bottom right corner
for i in range(my-1):
  for j in range(my-i-1):
    x,y=2*(my-j-1),2*(j+i+1)
    #horizontal predecessor
    testandset(sb,x,y,sb[x-2][y]+sb[x-1][y])
    #vertical predecessor
    testandset(sb,x,y,sb[x][y-2]+sb[x][y-1])

# shortest path is stored in SE corner of sandbox
print int(sb[2*(my-1)][2*(mx-1)])
