#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair <int , int> pii;

const int N = 2e3+10 , mod = 1e9+7;

bool ok[3][N][N];
int ans = -1 , s = 0;

void solve(string a , string b , int id){
   int n = a.length() , m = b.length();
   for(int i = 0 ; i <= n ; i++)
      ok[id][i][m] = true;
   for(int i = 0 ; i <= m ; i++)
      ok[id][n][i] = true;
   for(int i = n - 1 ; i >= 0 ; i--)
      for(int j = m - 1 ; j >= 0 ; j--){
         ok[id][i][j] = ok[id][i + 1][j + 1];
         ok[id][i][j] &= ((a[i] == b[j]) | (a[i] == '?') | (b[j] == '?'));
         if(ok[id][i][j])
            ans = min(ans , s - min(n - i , m - j));
      }
}

int32_t main(){
   ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
   string a , b , c;
   cin >> a >> b >> c;
   int n = a.length() , m = b.length() , k = c.length();
   s = n + m + k;
   ans = s;

   solve(a , b , 0);
   solve(a , c , 1);
   solve(b , c , 2);
   n = a.length() , m = b.length() , k = c.length();
   for(int i = 0 ; i < n ; i++){
      for(int j = 0 ; j < m ; j++){
         if(!ok[0][i][0])
            continue;
         if(i + j < n && !ok[1][i + j][0])
            continue;
         if(!ok[2][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , i + j + k - 1)) + 1);
      }
   }
   for(int i = 0 ; i < n ; i++){
      for(int j = i + m ; j < n ; j++){
         if(!ok[0][i][0])
            continue;
         if(!ok[1][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , j + k - 1)) + 1);
      }
   }

   swap(b , c);
   solve(a , b , 0);
   solve(a , c , 1);
   solve(b , c , 2);
   n = a.length() , m = b.length() , k = c.length();
   for(int i = 0 ; i < n ; i++){
      for(int j = 0 ; j < m ; j++){
         if(!ok[0][i][0])
            continue;
         if(i + j < n && !ok[1][i + j][0])
            continue;
         if(!ok[2][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , i + j + k - 1)) + 1);
      }
   }
   for(int i = 0 ; i < n ; i++){
      for(int j = i + m ; j < n ; j++){
         if(!ok[0][i][0])
            continue;
         if(!ok[1][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , j + k - 1)) + 1);
      }
   }

   swap(b , c);
   swap(a , b);
   solve(a , b , 0);
   solve(a , c , 1);
   solve(b , c , 2);
   n = a.length() , m = b.length() , k = c.length();
   for(int i = 0 ; i < n ; i++){
      for(int j = 0 ; j < m ; j++){
         if(!ok[0][i][0])
            continue;
         if(i + j < n && !ok[1][i + j][0])
            continue;
         if(!ok[2][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , i + j + k - 1)) + 1);
      }
   }
   for(int i = 0 ; i < n ; i++){
      for(int j = i + m ; j < n ; j++){
         if(!ok[0][i][0])
            continue;
         if(!ok[1][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , j + k - 1)) + 1);
      }
   }

   swap(b , c);
   solve(a , b , 0);
   solve(a , c , 1);
   solve(b , c , 2);
   n = a.length() , m = b.length() , k = c.length();
   for(int i = 0 ; i < n ; i++){
      for(int j = 0 ; j < m ; j++){
         if(!ok[0][i][0])
            continue;
         if(i + j < n && !ok[1][i + j][0])
            continue;
         if(!ok[2][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , i + j + k - 1)) + 1);
      }
   }
   for(int i = 0 ; i < n ; i++){
      for(int j = i + m ; j < n ; j++){
         if(!ok[0][i][0])
            continue;
         if(!ok[1][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , j + k - 1)) + 1);
      }
   }

   swap(a , b);
   solve(a , b , 0);
   solve(a , c , 1);
   solve(b , c , 2);
   n = a.length() , m = b.length() , k = c.length();
   for(int i = 0 ; i < n ; i++){
      for(int j = 0 ; j < m ; j++){
         if(!ok[0][i][0])
            continue;
         if(i + j < n && !ok[1][i + j][0])
            continue;
         if(!ok[2][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , i + j + k - 1)) + 1);
      }
   }
   for(int i = 0 ; i < n ; i++){
      for(int j = i + m ; j < n ; j++){
         if(!ok[0][i][0])
            continue;
         if(!ok[1][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , j + k - 1)) + 1);
      }
   }

   swap(b , c);
   solve(a , b , 0);
   solve(a , c , 1);
   solve(b , c , 2);
   n = a.length() , m = b.length() , k = c.length();
   for(int i = 0 ; i < n ; i++){
      for(int j = 0 ; j < m ; j++){
         if(!ok[0][i][0])
            continue;
         if(i + j < n && !ok[1][i + j][0])
            continue;
         if(!ok[2][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , i + j + k - 1)) + 1);
      }
   }
   for(int i = 0 ; i < n ; i++){
      for(int j = i + m ; j < n ; j++){
         if(!ok[0][i][0])
            continue;
         if(!ok[1][j][0])
            continue;
         ans = min(ans , max(n - 1 , max(i + m - 1 , j + k - 1)) + 1);
      }
   }

   cout << ans;
   return 0;
}


Measured memory_bytes: 12160