#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#include <utility>
#include <functional>
#include <time.h>
#include <stack>
#include <array>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;

int main()
{
	string a[3];
	int n[3];
	cin>>a[0]>>a[1]>>a[2];
	for(int i=0; i<3; i++) n[i]=a[i].size();
	bool b[3][3][6060]={};
	const int geta=2000;
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			for(int k=0; k<n[i]; k++){
				for(int l=0; l<n[j]; l++){
					if(a[i][k]!='?' && a[j][l]!='?' && a[i][k]!=a[j][l]){
						b[i][j][k-l+geta]=1;
					}
				}
			}
		}
	}
	int ans=n[0]+n[1]+n[2];
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++){
			if(i==j) continue;
			for(int k=0; k<3; k++){
				if(i==k || j==k) continue;
				for(int l=0; l<=2000; l++){
					for(int m=0; m<=4000; m++){
						if(b[i][j][l+geta] || b[i][k][m+geta] || b[j][k][m-l+geta]) continue;
						ans=min(ans, max({n[i], n[j]+l, n[k]+m}));
					}
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
