#include <bits/stdc++.h>
using namespace std;
long long dp[2][11];
const int maxn = 2e5 + 5;
long long a[maxn], top;
int main() {
  int n;
  scanf("%d", &n);
  int f = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < 10; j++) dp[!f][j] = dp[f][j];
    a[1] = a[2] = a[3] = 0;
    top = 0;
    long long _2 = 0, _3 = 0;
    int k;
    scanf("%d", &k);
    for (int j = 1; j <= k; j++) {
      int c;
      long long w;
      scanf("%d%lld", &c, &w);
      if (c == 1) {
        a[++top] = w;
      } else if (c == 2) {
        _2 = max(_2, w);
      } else {
        _3 = max(_3, w);
      }
    }
    sort(a + 1, a + 1 + top);
    long long add = max(max(a[1], _2), _3);
    if (add) {
      for (int j = 0; j <= 8; j++) {
        if (dp[f][j]) {
          dp[!f][j + 1] = max(dp[!f][j + 1], dp[f][j] + add);
        }
      }
      if (dp[f][9]) {
        dp[!f][0] = max(dp[!f][0], dp[f][9] + 2ll * add);
      }
    }
    add = 0;
    long long ma = 0;
    if (_2 && a[1]) add = _2 + a[1], ma = max(_2, a[1]);
    if (a[1] && a[2] && a[1] + a[2] > add) add = a[1] + a[2], ma = a[1];
    if (add) {
      for (int j = 0; j <= 7; j++) {
        if (dp[f][j]) {
          dp[!f][j + 2] = max(dp[!f][j + 2], dp[f][j] + add);
        }
      }
      if (dp[f][8]) {
        dp[!f][0] = max(dp[!f][0], dp[f][8] + add + ma);
      }
      if (dp[f][9]) {
        dp[!f][1] = max(dp[!f][1], dp[f][9] + add + ma);
      }
    }
    add = 0;
    if (a[3]) {
      for (int j = 0; j <= 9; j++) {
        dp[!f][(j + 3) % 10] =
            max(dp[!f][(j + 3) % 10],
                dp[f][j] + a[1] + a[2] + a[3] + (j + 3 > 9 ? a[1] : 0));
      }
    }
    memset(dp[f], 0, sizeof dp[f]);
    f = !f;
  }
  long long ans = 0;
  for (int i = 0; i <= 9; i++) {
    ans = max(ans, dp[f][i]);
  }
  printf("%lld\n", ans);
}
