#include <bits/stdc++.h>
using namespace std;
const int N = 10;
void knapsack_add(vector<vector<int> >& A, int size, int value, int bonus,
                  int j) {
  vector<int>&current = A[j % 2], &pre = A[(j + 1) % 2];
  for (int i = 0; i < current.size() - 1; i++)
    current[i] = max(current[i], pre[(N + i - size) % N] + value);
  current[N - 1] = max(current[N - 1], pre[N - 1 - size] + value + bonus);
}
int main() {
  std::ios::sync_with_stdio(false);
  int n, k, c, d;
  cin >> n;
  vector<vector<int> > A(2, vector<int>(N + 1, 0));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < N + 1; j++) A[i % 2][j] = 0;
    vector<int> B[3];
    cin >> k;
    for (int j = 0; j < k; j++) {
      cin >> c >> d;
      B[c - 1].push_back(d);
    }
    for (int j = 0; j < 3; j++) sort(B[j].begin(), B[j].end());
    int q = B[0].size();
    for (int p = 0; p < 3; p++)
      if (B[p].size() > 0) knapsack_add(A, 1, B[p].back(), B[p].back(), i);
    if (B[1].size() > 0 && B[0].size() > 0)
      knapsack_add(A, 2, B[1].back() + B[0].back(),
                   max(B[1].back(), B[0].back()), i);
    if (B[0].size() > 1)
      knapsack_add(A, 2, B[0][q - 1] + B[0][q - 2], B[0][q - 1], i);
    if (B[0].size() > 2)
      knapsack_add(A, 3, B[0][q - 1] + B[0][q - 2] + B[0][q - 3], B[0][q - 1],
                   i);
  }
  cout << *max_element(A[(n - 1) % 2].begin(), A[(n - 1) % 2].end()) << "\n";
  return 0;
}
