#include using namespace std; using ll = long long; struct Data { int v; int use; Data* prev; }; int main() { int N, M; cin >> N >> M; vector e(N), v(M), w(M); for (int i = 0; i < N; i++) cin >> e[i]; for (int i = 0; i < M; i++) cin >> v[i] >> w[i]; vector sum_v(1< sum_w(1<>i & 1) { sum_v[S] += v[i]; sum_w[S] += w[i]; } } } vector now(1< next(1< 0; T = (T-1)&U) { if (sum_w[T] > e[i]) continue; if (!next[S|T] || now[S]->v+sum_w[T] > next[S|T]->v) { next[S|T] = new Data{now[S]->v+sum_v[T], T, now[S]}; } } next[S] = new Data{now[S]->v, 0, now[S]}; } now = next; } ll m = 0; for (int S = 0; S < (1<v > m) m = now[S]->v; } int S = 0; for (int i = 0; i < (1<v == m) { S = i; break; } } vector> ans(N); Data* p = now[S]; while (p) { for (int i = 0; i < M; i++) { if (p->use>>i & 1) ans[N-1].push_back(i+1); } p = p->prev; N--; } cout << m << endl; for (int i = 0; i < ans.size(); i++) { cout << ans[i].size(); for (int j = 0; j < ans[i].size(); j++) cout << " " << ans[i][j]; cout << endl; } }