#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 7;
const long long mod = 1e9 + 7;
vector<long long> in[N][4];
long long dp[2][N];
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  vector<long long> v;
  long long n, k;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> k;
    v.push_back(k);
    long long c, d;
    for (int j = 0; j < k; j++) {
      cin >> c >> d;
      in[i][c].push_back(d);
    }
    for (int j = 1; j <= 3; j++) {
      if (in[i][j].size()) {
        sort(in[i][j].begin(), in[i][j].end());
        reverse(in[i][j].begin(), in[i][j].end());
      }
    }
  }
  int p = 0;
  long long sum = 0;
  for (int i = 0; i < n; i++, p ^= 1) {
    int playable;
    if (in[i][1].size() >= 3)
      playable = 3;
    else if (in[i][1].size() >= 2)
      playable = 2;
    else if (in[i][1].size() >= 1 && in[i][2].size() >= 1)
      playable = 2;
    else
      playable = 1;
    sum += playable;
    int mn = max(0LL, sum - 100);
    for (int j = mn; j <= sum; j++) {
      long long ans = 0;
      ans = max(ans, dp[p ^ 1][j]);
      if (in[i][1].size() >= 3 && j - 3 >= 0) {
        long long val = in[i][1][0] + in[i][1][1] + in[i][1][2];
        if ((j - 1) % 10 == 0 || (j - 2) % 10 == 0 || (j) % 10 == 0)
          val += in[i][1][0];
        ans = max(ans, val + dp[p ^ 1][j - 3]);
      }
      if (in[i][2].size() >= 1 && j - 1 >= 0) {
        long long val = in[i][2][0];
        if ((j) % 10 == 0) val += in[i][2][0];
        ans = max(ans, val + dp[p ^ 1][j - 1]);
      }
      if (in[i][3].size() >= 1 && j - 1 >= 0) {
        long long val = in[i][3][0];
        if ((j) % 10 == 0) val += in[i][3][0];
        ans = max(ans, val + dp[p ^ 1][j - 1]);
      }
      if (in[i][1].size() >= 1 && in[i][2].size() >= 1 && j - 2 >= 0) {
        long long val = in[i][1][0] + in[i][2][0];
        if (j % 10 == 0 || (j - 1) % 10 == 0)
          val += max(in[i][1][0], in[i][2][0]);
        ans = max(ans, val + dp[p ^ 1][j - 2]);
      }
      if (in[i][1].size() >= 2 && j - 2 >= 0) {
        long long val = in[i][1][0] + in[i][1][1];
        if (j % 10 == 0 || (j - 1) % 10 == 0) val += in[i][1][0];
        ans = max(ans, val + dp[p ^ 1][j - 2]);
      }
      if (in[i][1].size() >= 1 && j - 1 >= 0) {
        long long val = in[i][1][0];
        if (j % 10 == 0) val += in[i][1][0];
        ans = max(ans, val + dp[p ^ 1][j - 1]);
      }
      dp[p][j] = ans;
    }
  }
  long long fans = 0;
  int mn = max(0LL, sum - 100);
  for (int i = sum; i >= mn; i--) fans = max(fans, dp[(n - 1) % 2][i]);
  cout << fans << "\n";
  return 0;
}
