#include <bits/stdc++.h>
using namespace std;
const int N(2e6 + 2);
const int MOD(1e9 + 7);
int n, mp[N][3], xx, xy, f[2][8][2];
inline int get() {
  char c = 0;
  for (; c != '.' && c != 'X' && c != 'O'; c = getchar())
    ;
  if (c == '.') return 0;
  if (c == 'X') return 1;
  if (c == 'O') return 2;
  return c;
}
inline void add(int &x, int y) {
  x += y;
  if (x >= MOD) x %= MOD;
}
inline int allx(int x) { return (1 << x) - 1; }
int main() {
  scanf("%d", &n);
  for (int i(0); i < 3; i++) {
    for (int j(1); j <= n; j++) {
      mp[j][i] = get();
      if (mp[j][i] == 2) xx = j, xy = i;
    }
  }
  int now = 0;
  f[0][7][0] = 1;
  for (int i(1); i <= n; i++)
    for (int j(0); j < 3; j++) {
      now ^= 1;
      memset(f[now], 0, sizeof(f[now]));
      for (int s(0); s < 8; s++)
        for (int k(0); k < 2; k++)
          if (f[now ^ 1][s][k]) {
            int ss = ((s & 3) << 1), tmp = f[now ^ 1][s][k];
            if (mp[i][j] != 0) {
              if (i > 1 && !(s >> 2 & 1)) continue;
              add(f[now][ss | 1][k], tmp);
            } else {
              if (i > 1 && !(s >> 2 & 1))
                add(f[now][ss | 1][k || (i == xx - 1 && j == xy) ||
                                   (i == xx + 2 && j == xy)],
                    tmp);
              else {
                if (j && !(s & 1))
                  add(f[now][ss | 3][k || (i == xx && j == xy - 1) ||
                                     (i == xx && j == xy + 2)],
                      tmp);
                add(f[now][ss][k], f[now ^ 1][s][k]);
              }
            }
          }
    }
  printf("%d\n", f[now][7][1]);
  return 0;
}
