#include <bits/stdc++.h>
using namespace std;
struct myhash {
  size_t operator()(const vector<pair<char, pair<char, char> > > &t) const {
    size_t val = 0;
    for (pair<char, pair<char, char> > u : t)
      val = val * 73 + u.first * 19 + u.second.first * 5 + u.second.second;
    return val;
  }
};
unordered_map<vector<pair<char, pair<char, char> > >, double, myhash> dp;
const double INF = 1e9;
const pair<char, pair<char, char> > Newlevel =
    pair<char, pair<char, char> >('O', pair<char, char>('O', 'O'));
const char dice[4] = "BGR";
const double prob[3] = {2. / 6., 2. / 6., 1. / 6.};
void simply(pair<char, pair<char, char> > &x) {
  if (x.first == '_' || x.second == pair<char, char>('_', '_') ||
      x == Newlevel) {
    x.first = 'Z';
    return;
  }
  if (x.second.first == '_' || x.second.second == '_') x.first = 'A';
  if (x.second.first > x.second.second) swap(x.second.first, x.second.second);
}
void simply(vector<pair<char, pair<char, char> > > &x) {
  vector<pair<char, pair<char, char> > > r;
  for (auto &u : x) {
    simply(u);
    if (u.first != 'Z') r.push_back(u);
  }
  x.swap(r);
  sort(x.begin(), x.end() - 1);
}
int cnt;
double go(vector<pair<char, pair<char, char> > > x) {
  simply(x);
  if (((int)(x).size()) == 1) return 0;
  double &re = dp[x];
  if (re > 0) return re;
  double remain = 1. / 6.;
  double sum = 0;
  for (int i = 0; i < 3; i++) {
    double best = INF;
    for (int j = 0; j < ((int)(x).size()) - 1; j++) {
      for (int k = 0; k < 3; k++) {
        if (k == 0 && x[j].first != dice[i]) continue;
        if (k == 1 && x[j].second.first != dice[i]) continue;
        if (k == 2 && x[j].second.second != dice[i]) continue;
        vector<pair<char, pair<char, char> > > nxt = x;
        char out = dice[i];
        if (k == 0) nxt[j].first = '_';
        if (k == 1) nxt[j].second.first = '_';
        if (k == 2) nxt[j].second.second = '_';
        if (nxt.back().first != 'O' && nxt.back().second.first != 'O' &&
            nxt.back().second.second != 'O')
          nxt.push_back(Newlevel);
        auto &u = nxt.back();
        for (int l = 0; l < 3; l++) {
          if (l == 0 && u.first != 'O') continue;
          if (l == 1 && u.second.first != 'O') continue;
          if (l == 2 && u.second.second != 'O') continue;
          if (l == 0) u.first = out;
          if (l == 1) u.second.first = out;
          if (l == 2) u.second.second = out;
          best = min(best, go(nxt));
          if (l == 0) u.first = 'O';
          if (l == 1) u.second.first = 'O';
          if (l == 2) u.second.second = 'O';
        }
      }
    }
    if (best > INF / 2)
      remain += prob[i];
    else
      sum += best * prob[i];
  }
  if (remain > .99) return re = 0;
  re = (sum + 1) / (1 - remain);
  (void)0;
  for (pair<char, pair<char, char> > u : x) (void)0;
  return re;
}
int main() {
  int n;
  scanf("%d", &n);
  vector<pair<char, pair<char, char> > > init;
  for (int i = 0; i < n; i++) {
    char s[10];
    scanf("%s", s);
    pair<char, pair<char, char> > x;
    x.first = s[1], x.second.first = s[0], x.second.second = s[2];
    init.push_back(x);
  }
  printf("%.10f\n", go(init));
  return 0;
}
