#include <bits/stdc++.h>
const int MAX_SIZE = 10000;
const int MOD = 1000000000 + 7;
char mat[3][MAX_SIZE + 10];
int f[2][1 << 3][2];
int n;
inline void inc(int& a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < 3; i++) scanf("%s", mat[i]);
  f[0][(1 << 3) - 1][0] = 1;
  int cur = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < 3; j++) {
      memset(f[cur ^ 1], 0, sizeof(f[cur ^ 1]));
      for (int st = 0; st < 8; st++) {
        for (int t = 0; t < 2; t++) {
          if (f[cur][st][t] == 0) continue;
          if (!(st & 4)) {
            if (mat[j][i] != 'X' && mat[j][i] != 'O')
              inc(f[cur ^ 1][(st << 1) | 1]
                   [t || (i - 2 >= 0 && mat[j][i - 2] == 'O') ||
                    (i + 1 < n && mat[j][i + 1] == 'O')],
                  f[cur][st][t]);
          } else if (mat[j][i] != 'X' && mat[j][i] != 'O') {
            if (j > 0 && !(st & 1))
              inc(f[cur ^ 1][((st ^ 4) << 1) | 3]
                   [t || (j - 2 >= 0 && mat[j - 2][i] == 'O') ||
                    (j + 1 < 3 && mat[j + 1][i] == 'O')],
                  f[cur][st][t]);
            inc(f[cur ^ 1][(st ^ 4) << 1][t], f[cur][st][t]);
          } else
            inc(f[cur ^ 1][((st ^ 4) << 1) | 1][t], f[cur][st][t]);
        }
      }
      cur ^= 1;
    }
  }
  printf("%d\n", f[cur][7][1]);
  return 0;
}
