#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
ostream& operator<<(ostream& os, const pair<S, T>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <class T>
void debug(T a, T b) {
  cerr << "[";
  for (T i = a; i != b; ++i) {
    if (i != a) cerr << ", ";
    cerr << *i;
  }
  cerr << "]\n";
}
struct Card {
  char color;
  int needR;
  int needB;
};
const int INF = 1e9;
vector<Card> card;
const int N = 16;
int dp[1 << N][2][N * N + 10];
int go(int mask, int haveR, int haveB, int rCards, int bCards) {
  assert(haveR == 0 or haveB == 0);
  if (mask == 0) {
    return 0;
  }
  bool par = haveR == 0;
  int diff = max(haveR, haveB);
  int& ret = dp[mask][par][diff];
  if (~ret) {
    return ret;
  }
  ret = INF;
  for (int i = 0; i < (((int)card.size())); ++i) {
    if (mask >> i & 1) {
      int needR = max(card[i].needR - rCards, 0);
      int needB = max(card[i].needB - bCards, 0);
      int curR = haveR - needR;
      int curB = haveB - needB;
      int cur = max(0, max(-curR, -curB));
      curR += cur;
      curB += cur;
      cur += go(mask ^ (1 << i), curR, curB, rCards + (card[i].color == 'R'),
                bCards + (card[i].color == 'B'));
      ret = min(ret, cur);
    }
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  card.resize(n);
  int haveR = 0, haveB = 0;
  for (int i = 0; i < (n); ++i) {
    cin >> card[i].color >> card[i].needR >> card[i].needB;
    if (card[i].needR >= n) {
      haveR += card[i].needR - n;
      card[i].needR = n;
    }
    if (card[i].needB >= n) {
      haveB += card[i].needB - n;
      card[i].needB = n;
    }
  }
  int offset = n + max(haveR, haveB);
  if (haveR >= haveB) {
    haveB = haveR - haveB;
    haveR = 0;
  } else {
    haveR = haveB - haveR;
    haveB = 0;
  }
  haveR = min(haveR, n * n);
  haveB = min(haveB, n * n);
  memset(dp, -1, sizeof(dp));
  cout << offset + go((1 << n) - 1, haveR, haveB, 0, 0) << "\n";
  return 0;
}
