#include #include #include using namespace std; #define PII pair const int INF = 0x4fffffff; const int MAX_W = 54; const int MAX_N = 302; int max(int a, int b){return a>b?a:b;} int min(int a, int b){return a>b?b:a;} int N, W; vector P[MAX_W]; int d[MAX_W][MAX_N]; int trc[MAX_W][MAX_N]; int main(){ // freopen("input.txt","r",stdin); scanf("%d %d", &N, &W); for(int i = W ; i >= 0 ; i --){ int K; scanf("%d", &K); int a[MAX_N]; for(int j = 0 ; j < K ; j ++) scanf("%d", &a[j]); int b[MAX_N]; for(int j = 0 ; j < K ; j ++) scanf("%d", &b[j]); for(int j = 0 ; j < K ; j ++) P[i].push_back(PII(a[j], b[j])); sort(P[i].begin(), P[i].end()); } for(int i = W ; i >= 0 ; i --){ for(int j = 0 ; j <= N ; j ++){ d[i][j] = -INF; } } for(int i = 0 ; i < P[W].size() ; i ++){ if(P[W][i].second <= N){ int z = P[W][i].first*P[W][i].second; if(d[W][N-P[W][i].second] < z){ d[W][N-P[W][i].second] = z; trc[W][N-P[W][i].second] = i; } } } for(int i = W-1 ; i >= 0 ; i --){ for(int j = 1 ; j <= N ; j ++){ for(int k = 0 ; k < P[i].size() ; k ++){ if(j + P[i][k].second <= N){ int z = d[i+1][j+P[i][k].second] + P[i][k].second*P[i][k].first; if(d[i][j] < z){ d[i][j] = z; trc[i][j] = trc[i+1][j+P[i][k].second]; } } } } for(int k = 0 ; k < P[i].size() ; k ++){ for(int l = 0 ; l <= P[i][k].second ; l ++){ if(l <= N){ int z = d[i+1][l] + P[i][k].first*l; if(d[i][0] < z){ d[i][0] = z; trc[i][0] = trc[i+1][l]; } } } } } int mx = -1; int mw = -1; for(int i = 0 ; i <= N ; i ++){ if(mx < d[0][i]){ mx = d[0][i]; mw = i; } } printf("%d\n", mx); printf("%d\n", P[W][trc[0][mw]].first); return 0; }