#include <bits/stdc++.h>
using namespace std;
#define mod 998244353
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3fll
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
string s[3];
int n[3];
int ok[3][3][8080];
int okpos[3][3];
bool check(int i,int j,int p)
{
	if(ok[i][j][p]!=-1)return ok[i][j][p];
	for(int q=0;q<n[j];q++)
	{
		if(p+q>=n[i])break;
		if(s[i][p+q]!='?'&&s[j][q]!='?'&&s[i][p+q]!=s[j][q])return ok[i][j][p]=0;
	}
	return ok[i][j][p]=1;
}
int main()
{
	memset(ok,-1,sizeof(ok));
	for(int i=0;i<3;i++)
	{
		cin>>s[i];
		n[i]=s[i].length();
	}
	int ans=n[0]+n[1]+n[2];
	for(int fst=0;fst<3;fst++)
	{
		for(int snd=0;snd<3;snd++)
		{
			if(fst==snd)continue;
			
			for(int mchpos=0;mchpos<=n[fst];mchpos++)
			{
				if(!check(fst,snd,mchpos))continue;
				//fst [0,n[fst])
				//snd [mchpos,mchpos+n[snd])
				int trd=0;
				while(trd==fst||trd==snd)trd++;
				for(int mchpos2=mchpos;mchpos2<=max(n[fst],mchpos+n[snd]);mchpos2++)
				{
					if(check(fst,trd,mchpos2)&&check(snd,trd,mchpos2-mchpos))
					{
						ans=min(ans,max(max(n[fst],mchpos+n[snd]),mchpos2+n[trd]));
					}
				}
			}
			
			
		}
	}
	cout<<ans;
	return 0;
}