#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void smax(T &x, T y) {
  x = max((x), (y));
}
template <class T>
inline void smin(T &x, T y) {
  x = min((x), (y));
}
const int MOD = 1e9 + 7;
const int SIZE = 1e4 + 10;
int n;
string board[3];
int dp[SIZE][1 << 6];
int done[SIZE][1 << 6];
int t;
int mo(int x) {
  x %= MOD;
  while (x < 0) x += MOD;
  return x;
}
void add(int r, int c, int rinc, int cinc, char ch) {
  board[r][c] = ch;
  board[r + rinc][c + cinc] = ch;
}
int getmask(int c) {
  int ret = 0;
  for (int i = 0; i < (3); ++i) {
    for (int j = 0; j < (2); ++j)
      if (board[i][c + j] != '.') ret += 1 << (3 * j + i);
  }
  return ret;
}
int go(int c) {
  if (c >= n) return 1;
  int mask = getmask(c);
  if ((mask & 7) == 7) {
    return go(c + 1);
  }
  int &ret = dp[c][mask];
  if (done[c][mask] == t) {
    return ret;
  }
  done[c][mask] = t;
  ret = 0;
  for (int i = 0; i < (3); ++i) {
    if (board[i][c] == '.') {
      if (board[i][c + 1] == '.') {
        add(i, c, 0, 1, 'H');
        ret = mo(ret + go(c));
        add(i, c, 0, 1, '.');
      }
      if (i + 1 < 3 && board[i + 1][c] == '.') {
        add(i, c, 1, 0, 'V');
        ret = mo(ret + go(c));
        add(i, c, 1, 0, '.');
      }
      break;
    }
  }
  return ret;
}
int main() {
  if (0) {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
  }
  while (cin >> n) {
    t = 0;
    memset((done), 0, sizeof((done)));
    for (int i = 0; i < (3); ++i) cin >> board[i];
    int r, c;
    r = c = -1;
    for (int i = 0; i < (3); ++i)
      for (int j = 0; j < (n); ++j)
        if (board[i][j] == 'O') r = i, c = j;
    if (r == 2) {
      swap(board[0], board[2]);
      r = 0;
    }
    for (int i = 0; i < (3); ++i) board[i].append(1, 'X');
    bool oklef = true, okrig = true, okdow = true;
    for (int i = (1); i < (3); ++i) {
      if (c - i < 0 || board[r][c - i] != '.') oklef = false;
      if (c + i >= n || board[r][c + i] != '.') okrig = false;
      if (r + i >= 3 || board[r + i][c] != '.') okdow = false;
    }
    int ans = 0;
    t++;
    if (oklef) {
      add(r, c - 2, 0, 1, 'H');
      ans = mo(ans + go(0));
      add(r, c - 2, 0, 1, '.');
    }
    t++;
    if (okrig) {
      add(r, c + 1, 0, 1, 'H');
      ans = mo(ans + go(0));
      add(r, c + 1, 0, 1, '.');
    }
    t++;
    if (okdow) {
      add(r + 1, c, 1, 0, 'V');
      ans = mo(ans + go(0));
      add(r + 1, c, 1, 0, '.');
    }
    t++;
    if (oklef && okrig) {
      add(r, c - 2, 0, 1, 'H');
      add(r, c + 1, 0, 1, 'H');
      ans = mo(ans - go(0));
      add(r, c - 2, 0, 1, '.');
      add(r, c + 1, 0, 1, '.');
    }
    t++;
    if (oklef && okdow) {
      add(r, c - 2, 0, 1, 'H');
      add(r + 1, c, 1, 0, 'V');
      ans = mo(ans - go(0));
      add(r, c - 2, 0, 1, '.');
      add(r + 1, c, 1, 0, '.');
    }
    t++;
    if (okrig && okdow) {
      add(r, c + 1, 0, 1, 'H');
      add(r + 1, c, 1, 0, 'V');
      ans = mo(ans - go(0));
      add(r, c + 1, 0, 1, '.');
      add(r + 1, c, 1, 0, '.');
    }
    t++;
    if (oklef && okrig && okdow) {
      add(r, c - 2, 0, 1, 'H');
      add(r, c + 1, 0, 1, 'H');
      add(r + 1, c, 1, 0, 'V');
      ans = mo(ans + go(0));
      add(r, c - 2, 0, 1, '.');
      add(r, c + 1, 0, 1, '.');
      add(r + 1, c, 1, 0, '.');
    }
    printf("%d\n", ans);
  }
  return 0;
}
