#include #include #include using namespace std; #define PII pair int max(int a, int b){return a>b?a:b;} int min(int a, int b){return a>b?b:a;} const int MAX_N = 302; const int MAX_W = 55; const int INF = 0x3fffffff; int N, W; vector dat[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 = 0 ; i <= W ; i ++){ int K; scanf("%d", &K); int a[MAX_N]; for(int j = 1 ; j <= K ; j ++) scanf("%d", &a[j]); int b[MAX_N]; for(int j = 1 ; j <= K ; j ++) scanf("%d", &b[j]); for(int j = 1 ; j <= K ; j ++){ dat[i].push_back(PII(a[j], b[j])); }sort(dat[i].begin(), dat[i].end()); } for(int i = 0 ; i <= W ; i ++) for(int j = 0 ; j <= N ; j ++) d[i][j] = -INF; for(int j = 0 ; j < N ; j ++){ for(int k = 0 ; k < dat[0].size() ; k ++){ if(j-dat[0][k].second == 0){ int z= dat[0][k].first*dat[0][k].second; if(d[0][j] < z){ d[0][j] = z; trc[0][j] = k; } } } } for(int k = 0 ; k < dat[0].size() ; k ++){ for(int l = 0 ; l <= dat[0][k].second ; l ++){ if(N-l == 0){ int z = dat[0][k].first*l; if(d[0][N] < z){ d[0][N] = z; trc[0][N] = k; } } } } for(int i = 1 ; i <= W ; i ++){ for(int j = 0 ; j < N ; j ++){ for(int k = 0 ; k < dat[i].size() ; k ++){ if(j-dat[i][k].second >= 0){ int z = d[i-1][j-dat[i][k].second] + dat[i][k].first*dat[i][k].second; if(d[i][j] < z){ d[i][j] = z; trc[i][j] = trc[i-1][j-dat[i][k].second]; } } } } for(int k = 0 ; k < dat[i].size() ; k ++){ for(int l = 0 ; l <= dat[i][k].second ; l ++){ if(N-l >= 0){ int z = d[i-1][N-l] + l*dat[i][k].first; if(d[i][N] < z){ d[i][N] = z; trc[i][N] = trc[i-1][N-l]; } } } } } int mx = -1; int mw = -1; for(int i = 0 ; i <= N ; i ++){ if(mx < d[W][i]){ mx = d[W][i]; mw = i; } } printf("%d\n", mx); printf("%d\n", dat[0][trc[W][mw]].first); return 0; }