#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 10;
const int B = 1e9 + 9;

char s[3][N];
int ss[3][N];
long long dp[N][2][2];
int len[3];
int mxlen;
long long cnt[28][28][28][3][3];
// 0 : =
// 1 : <
// 2 : >

int main() {
  int t;
  for (int i = 0; i < 27; ++i) {
    for (int j = 0; j < 27; ++j) {
      for (int k = 0; k < 27; ++k) {
        int x = i < j ? 1 : (i == j) ? 0 : 2;
        int y = j < k ? 1 : (j == k) ? 0 : 2;
        cnt[i][j][k][x][y]++;
        if (i)
          cnt[27][j][k][x][y]++;
        if (j)
          cnt[i][27][k][x][y]++;
        if (i && j)
          cnt[27][27][k][x][y]++;
        if (k)
          cnt[i][j][27][x][y]++;
        if (i && k)
          cnt[27][j][27][x][y]++;
        if (j && k)
          cnt[i][27][27][x][y]++;
        if (i && j && k)
          cnt[27][27][27][x][y]++;
      }
    }
  }
  scanf("%d", &t);
  while (t--) {
    memset(ss, 0, sizeof(ss));
    memset(dp, 0, sizeof(dp));
    scanf("%s%s%s", s[0], s[1], s[2]);
    for (int i = 0; i < 3; ++i) {
      len[i] = strlen(s[i]);
      mxlen = max(mxlen, len[i]);
    }
    for (int i = 0; i < 3; ++i) {
      for (int j = 0; j < len[i]; ++j) {
        ss[i][j] = s[i][j] != '?' ? (s[i][j] - 'a' + 1) : 27;
      }
    }
    for (int i = 0; i < 2; ++i) {
      for (int j = 0; j < 2; ++j) {
        dp[0][i][j] = cnt[ss[0][0]][ss[1][0]][ss[2][0]][i][j];
      }
    }
    /*
    for (int i = 0; i < 2; ++i) {
      for (int j = 0; j < 2; ++j)
        printf("%d ", dp[0][i][j]);
      printf("\n");
    }*/
    for (int i = 1; i < mxlen; ++i) {
      int a = ss[0][i], b = ss[1][i], c = ss[2][i];
      dp[i][0][0] = dp[i - 1][0][0] * cnt[a][b][c][0][0] % B;
      dp[i][0][1] = dp[i - 1][0][0] * cnt[a][b][c][0][1] % B + dp[i - 1][0][1] * ((cnt[a][b][c][0][1] + cnt[a][b][c][0][0] + cnt[a][b][c][0][2]) % B) % B;
      dp[i][0][1] %= B;
      dp[i][1][0] = dp[i - 1][0][0] * cnt[a][b][c][1][0] % B + dp[i - 1][1][0] * ((cnt[a][b][c][0][0] + cnt[a][b][c][1][0] + cnt[a][b][c][2][0]) % B) % B;
      dp[i][1][0] %= B;
      dp[i][1][1] = dp[i - 1][0][0] * cnt[a][b][c][1][1] % B;
      dp[i][1][1] += dp[i - 1][0][1] * ((cnt[a][b][c][1][0] + cnt[a][b][c][1][1] + cnt[a][b][c][1][2]) % B) % B;
      dp[i][1][1] %= B;
      dp[i][1][1] += dp[i - 1][1][0] * ((cnt[a][b][c][0][1] + cnt[a][b][c][1][1] + cnt[a][b][c][2][1]) % B) % B;
      dp[i][1][1] %= B;
      dp[i][1][1] += dp[i - 1][1][1] * ((cnt[a][b][c][0][0] + cnt[a][b][c][0][1] + cnt[a][b][c][0][2] +
        cnt[a][b][c][1][0] + cnt[a][b][c][1][1] + cnt[a][b][c][1][2] +
        cnt[a][b][c][2][0] + cnt[a][b][c][2][1] + cnt[a][b][c][2][2]) % B) % B;
      dp[i][1][1] %= B;
    }
    printf("%lld\n", dp[mxlen - 1][1][1]);
  }
  return 0;
}