#include <bits/stdc++.h>
using namespace std;
int N;
struct Card {
  char type;
  int r, b;
};
vector<Card> ca;
int cc[1 << 16][2][16 * 16 + 1];
int solve(int mask, char type, int remain) {
  if (mask == (1 << N) - 1) return 0;
  int& ret = cc[mask][type == 'R' ? 0 : 1][remain];
  if (ret != -1) return ret;
  ret = 1e9;
  int cardR = 0, cardB = 0;
  for (int i = 0; i < N; i++) {
    if (!(mask & (1 << i))) continue;
    if (ca[i].type == 'R')
      cardR++;
    else
      cardB++;
  }
  for (int i = 0; i < N; i++) {
    if (mask & (1 << i)) continue;
    int haveR = (type == 'R') ? remain : 0;
    int haveB = (type == 'B') ? remain : 0;
    int needR = max(0, ca[i].r - (haveR + cardR));
    int needB = max(0, ca[i].b - (haveB + cardB));
    int needTurn = max(needR, needB);
    int nextR = haveR + needTurn - max(0, ca[i].r - cardR);
    int nextB = haveB + needTurn - max(0, ca[i].b - cardB);
    if (nextB == 0) {
      ret = min(ret, solve(mask | (1 << i), 'R', nextR) + needTurn);
    } else {
      ret = min(ret, solve(mask | (1 << i), 'B', nextB) + needTurn);
    }
  }
  return ret;
}
int main() {
  cin >> N;
  ca.resize(N);
  int needR = 0, needB = 0;
  for (int i = 0; i < N; i++) {
    cin >> ca[i].type >> ca[i].r >> ca[i].b;
    needR += max(ca[i].r - N, 0);
    ca[i].r = min(ca[i].r, N);
    needB += max(ca[i].b - N, 0);
    ca[i].b = min(ca[i].b, N);
  }
  memset(cc, -1, sizeof(cc));
  int ans = max(needR, needB) + N;
  if (needR < needB) {
    ans += solve(0, 'R', min(N * N, needB - needR));
  } else {
    ans += solve(0, 'B', min(N * N, needR - needB));
  }
  cout << ans;
  return 0;
}
