#include <bits/stdc++.h>
using namespace std;

/*
二维费用背包:创建一个三维数组 yh[n+1][w+1][v+1] 记录在第n个物品,w重量,v体积时 最优策略
二维费用的背包问题,在01背包问题的基础上增加一个费用维度
状态转移方程:
dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-w[i]][k-v[i]]+c[i])
*/
int w,v,n;
//记录有i个物品,承载重量为j,背包容量为k时的最大价值
int dp[110][110][110];
int a[110],b[110],c[110];//分别代表每个物品的重量、体积、让利金额
string r[110][110][110];//代表哪了哪些物品

int main() {
	//读入数据
	cin>>w>>v>>n;
	for(int i = 1; i <= n; i++) {
		cin>>a[i]>>b[i]>>c[i];
	}

	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= w; j++) {
			for(int k = 0; k <= v; k++) {
				r[i][j][k] = "";
			}
		}
	}

	//循环物品数量
	for(int i = 1; i <= n; i++) {
		//循环重量
		for(int j = 1; j <= w; j++) {
			//循环体积
			for(int k = 1; k <= v; k++) {

				//承重 和 体积都够,尝试拿这个物品
				if(j >= a[i] && k >= b[i]) {
					dp[i][j][k] = max(dp[i-1][j][k],dp[i-1][j-a[i]][k-b[i]]+c[i]);
					//判断该物品是否拿
					//拿了
					if(dp[i-1][j][k]<dp[i-1][j-a[i]][k-b[i]]+c[i]) {
						r[i][j][k] = r[i-1][j-a[i]][k-b[i]] + (char)(i + '0') + " ";
					} else {
						r[i][j][k] = r[i-1][j][k];
					}
				} else {
					//没拿
					dp[i][j][k] = dp[i-1][j][k];
					r[i][j][k] = r[i-1][j][k];
				}
			}
		}
	}


	//最大让利金额
	cout<<dp[n][w][v]<<endl;
	if(r[n][w][v] != "") r[n][w][v] = r[n][w][v].substr(0,r[n][w][v].size()-1);
	cout<<r[n][w][v];//注意结果会有一个尾随空格
	return 0;
}


/**************************************************************
	Problem: 1949
	User: admin
	Language: C++
	Result: Accepted
	Time:132 ms
	Memory:48872 kb
****************************************************************/