#include<iostream>
#include<algorithm>
#include<vector>
#include<string>

using namespace std;

bool match(char x, char y) {
	if (x == y || x == '?' || y == '?')return true;
	else return false;
}

string a, b, c;
bool ab[100000], bc[100000], ac[100000];
//ab[i] := bの置く場所がaの置く場所からの距離がi - 50000のときに、問題なくマッチできるか？
//trueなら不可能

int main() {
	
	cin >> a >> b >> c;
	int A = a.size(), B = b.size(), C = c.size();

	for (int i = 0; i < A; i++)
		for (int j = 0; j < B; j++)
			if (!match(a[i], b[j]))ab[50000 + i - j] = true;

	for (int i = 0; i < A; i++)
		for (int j = 0; j < C; j++)
			if (!match(a[i], c[j]))ac[50000 + i - j] = true;

	for (int i = 0; i < B; i++)
		for (int j = 0; j < C; j++)
			if (!match(b[i], c[j]))bc[50000 + i - j] = true;

	int ans = 1145141919;
	for (int i = -4050; i <= 4050; i++) {
		for (int j = -4050; j <= 4050; j++) {
			//bはaからの相対距離がi、cはaからの相対距離がj
			if (!ab[i + 50000] && !ac[j + 50000] && !bc[j - i + 50000]) {
				int L, R;//[L, R]
				L = min(0, min(i, j));
				R = max(A, max(i + B, j + C)) - 1;
				ans = min(ans, R - L + 1);
			}
		}
	}
	cout << ans << endl;
	
	return 0;
}