def inner(a,b,la,lb):
  for i in range(lb-la+1):
    for j in range(la):
      if a[j]=='?' or a[j]==b[i+j]:
        continue
      elif b[i+j]=='?':
        continue
      else:
        break
    else:
      return True
  return False

def head(a,b,la):
  for i in range(la,-1,-1):
    for j in range(i):
      if a[j]=='?' or a[j]==b[-(i-j)]:
        continue
      elif b[-(i-j)]=='?':
        continue
      else:
        break
    else:
      return b+a[i:]

def tail(a,b,la):
  for i in range(la,-1,-1):
    for j in range(i):
      if a[-(i-j)]=='?' or a[-(i-j)]==b[j]:
        continue
      elif b[j]=='?':
        continue
      else:
        break
    else:
      return a+b[i:]
      break

a=input()
la=len(a)
b=input()
lb=len(b)
c=input()
lc=len(c)
arr=[[a,la],[b,lb],[c,lc]]
arr=sorted(arr,key=lambda x:x[1])
a,la=arr[0]
b,lb=arr[1]
c,lc=arr[2]
tmp1=head(a,c,la)
tmp2=tail(a,c,la)
ans1=min(len(head(b,tmp1,lb)),len(tail(b,tmp1,lb)))
if inner(b,tmp1,lb,len(tmp1)):
  ans1=min(ans1,len(tmp1))
ans2=min(len(head(b,tmp2,lb)),len(tail(b,tmp2,lb)))
if inner(b,tmp2,lb,len(tmp2)):
  ans2=min(ans2,len(tmp2))
ans3=10**18
if inner(a,c,la,lc):
  ans3=min(len(head(b,c,lb)),len(tail(b,c,lb)))
  if inner(b,c,lb,lc):
    ans3=min(ans3,lc)
ansac=min(ans1,ans2,ans3)
tmp1=head(b,c,lb)
tmp2=tail(b,c,lb)
ans1=min(len(head(a,tmp1,la)),len(tail(a,tmp1,la)))
if inner(a,tmp1,la,len(tmp1)):
  ans1=min(ans1,len(tmp1))
ans2=min(len(head(a,tmp2,la)),len(tail(a,tmp2,la)))
if inner(a,tmp2,la,len(tmp2)):
  ans2=min(ans2,len(tmp2))
ans3=10**18
if inner(b,c,lb,lc):
  ans3=min(len(head(a,c,la)),len(tail(a,c,la)))
  if inner(a,c,la,lc):
    ans3=min(ans3,lc)
ansbc=min(ans1,ans2,ans3)
tmp1=head(a,b,la)
lt1=len(tmp1)
tmp2=tail(a,b,la)
lt2=len(tmp2)
if lt1>=lc:
  ans1=min(len(head(c,tmp1,lc)),len(tail(c,tmp1,lc)))
  if inner(c,tmp1,lc,lt1):
    ans1=min(ans1,lt1)
else:
  ans1=min(len(head(tmp1,c,lt1)),len(tail(tmp1,c,lt1)))
  if inner(tmp1,c,lt1,c):
    ans1=min(ans1,c)
if lt2>=lc:
  ans2=min(len(head(c,tmp2,lc)),len(tail(c,tmp2,lc)))
  if inner(c,tmp2,lc,lt2):
    ans2=min(ans2,lt2)
else:
  ans2=min(len(head(tmp2,c,lt2)),len(tail(tmp2,c,lt2)))
  if inner(tmp2,c,lt2,lc):
    ans2=min(ans2,lc)
ans3=10**18
if inner(a,b,la,lb):
  ans3=min(len(head(b,c,lb)),len(tail(b,c,lb)))
  if inner(b,c,lb,lc):
    ans3=min(ans3,lc)
ansab=min(ans1,ans2,ans3)
ans=min(ansac,ansbc,ansab)
print(ans)

### FIXED CODE ###

a=tuple(input())
len_a=len(a)
b=tuple(input())
len_b=len(b)
c=tuple(input())
len_c=len(c)
flag_ab=[True]*20000
for i in range(len_a):
  for j in range(len_b):
    if a[i]!=b[j] and a[i]!='?' and b[j]!='?':
      flag_ab[i-j+10000]=False
flag_ac=[True]*20000
for i in range(len_a):
  for j in range(len_c):
    if a[i]!=c[j] and a[i]!='?' and c[j]!='?':
      flag_ac[i-j+10000]=False
flag_bc=[True]*20000
for i in range(len_b):
  for j in range(len_c):
    if b[i]!=c[j] and b[i]!='?' and c[j]!='?':
      flag_bc[i-j+10000]=False
ans=len_a+len_b+len_c
left_a=0
for left_b in range(-(len_b+len_c),len_b+len_c+1):
  for left_c in range(-(len_b+len_c),len_b+len_c+1):
    if flag_ab[left_b-left_a+10000] and flag_ac[left_c-left_a+10000] and flag_bc[left_c-left_b+10000]:
      right_a=left_a+len_a
      right_b=left_b+len_b
      right_c=left_c+len_c
      left=min(left_a,left_b,left_c)
      right=max(right_a,right_b,right_c)
      ans=min(ans,right-left)
print(ans)