#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;

const int MAXN = 1E6 + 10;
const ll MOD = 1E9 + 9;

int n[3], m;
char s[3][MAXN];
ll e[3][MAXN];
ll f[2][MAXN];

void pre(char a[], char b[], ll c[]){
	ll cnt = 1;
	c[m] = 0;
	for (int i = m - 1; i >= 0; --i){
		char c1 = a[i], c2 = b[i];
		if (c1 != '?'){
			if (c2 != '?')
				c[i] = c1 == c2 ? c[i + 1] : c1 < c2 ? cnt : 0;
			else
				c[i] = (('z' - c1) * cnt + (c1 >= 'a' ? c[i + 1] : 0)) % MOD;
		}
		else{
			if (c2 != '?')
				c[i] = c2 >= 'a' ? ((c2 - 'a') * cnt + c[i + 1]) % MOD : 0;
			else
				c[i] = (325 * cnt + 26 * c[i + 1]) % MOD;
		}
		if (c1 == '?')
			cnt = cnt * 26 % MOD;
		if (c2 == '?')
			cnt = cnt * 26 % MOD;
	}
}

inline bool equal(char a, char b){
	return a == '?' && ('a' <= b && b <= 'z') || b == '?' && ('a' <= a && a <= 'z') || a == b;
}

int main(){
	int cas;
	scanf("%d", &cas);
	while (cas--){
		for (int i = 0; i < 3; ++i){
			scanf("%s", s[i]);
			n[i] = strlen(s[i]);
			m = max(m, n[i]);
		}
		for (int i = 0; i < 3; ++i){
			for (int j = n[i]; j < m; ++j)
				s[i][j] = 'a' - 1;
			s[i][m] = '\0';
			e[i][m] = 1;
			for (int j = m - 1; j >= 0; --j)
				e[i][j] = s[i][j] == '?' ? e[i][j + 1] * 26 % MOD : e[i][j + 1];
		}
		pre(s[0], s[1], f[0]);
		pre(s[1], s[2], f[1]);

		ll ans = 0, cnt = 1;
		for (int i = 0; i < m; ++i){
			char c1 = s[0][i], c2 = s[1][i], c3 = s[2][i];
			ll A = e[0][i + 1] * e[1][i + 1] % MOD * e[2][i + 1] % MOD;
			ll B = f[0][i + 1] * e[2][i + 1] % MOD;
			ll C = f[1][i + 1] * e[0][i + 1] % MOD;
			ll s0 = 0;
			if (c2 != '?'){
				if (c1 != '?'){
					if (c3 != '?'){
						if (c1 < c2 && c2 < c3)
							s0 = A;
						else if (c1 == c2 && c2 < c3)
							s0 = B;
						else if (c1 < c2 && c2 == c3)
							s0 = C;
					}
					else{
						if (c1 < c2)
							s0 = ('z' - c2) * A + C;
						else if (c1 == c2)
							s0 = ('z' - c2) * B;
					}
				}
				else{
					if (c3 != '?'){
						if (c2 < c3)
							s0 = c2 >= 'a' ? (c2 - 'a') * A + B : 0;
						else if (c2 == c3)
							s0 = c2 >= 'a' ? (c2 - 'a') * C : 0;
					}
					else
						s0 = c2 >= 'a' ? (c2 - 'a') * ('z' - c2) * A + ('z' - c2) * B + (c2 - 'a') * C : 0;
				}
			}
			else{
				if (c1 != '?'){
					if (c3 != '?'){
						if (c1 < c3)
							s0 = (c3 - c1 - 1) * A + (c1 >= 'a') * B + C;
					}
					else{
						int t = 'z' - c1;
						s0 = t * (t - 1) / 2 * A + (c1 >= 'a' ? t : 0) * B + t * C;
					}
				}
				else{
					if (c3 != '?'){
						int t = c3 - 'a';
						s0 = c3 >= 'b' ? t * (t - 1) / 2 * A + t * B + t * C : 0;
					}
					else{
						s0 = 2600 * A + 325 * B + 325 * C;
					}
				}
			}
			ans = (ans + s0 % MOD * cnt) % MOD;
			char c0 = '\0';
			for (int j = 0; j < 3; ++j)
				if (s[j][i] != '?')
					c0 = s[j][i];
			if (!c0)
				cnt = cnt * 26 % MOD;
			else if (!equal(c0, c1) || !equal(c0, c2) || !equal(c0, c3))
				break;
		}
		printf("%d\n", (int)ans);
	}
	return 0;
}

