//Problem ranca
//Druga varijanta - od svake vrste predmeta postoji po jedan primerak

#include <stdio.h>
#include <stdlib.h>

#define INF -1

int manji(int x, int y) {
    if (y==INF) return 1;
    if (x==INF) return 0;
    return x<y;
}

int main() {

	int **opt, *karte, n, z, x;
	int i,j;

	scanf("%d%d%d", &n, &z, &x);

	karte = (int *)malloc((n+1)*sizeof(int));

	opt = (int **)malloc((n+1)*sizeof(int *));

	for (i=0; i<=n; i++)
		opt[i] = (int *)malloc((z+1)*sizeof(int));
	// opt[i][j] - vrednost u rancu zapremine j koji je optimalno popunjen predmetima od 1 do i

	for (i=1; i<=n; i++)
		scanf("%d", &karte[i]);

	for (i=0; i<=n; i++)
		opt[i][0] = 0;

	for (i=0; i<=z; i++)
		opt[0][i] = 0;

	for (i=1; i<=n; i++) {	//predmeti
		for (j=1; j<=z; j++) {	//zapremine
            opt[i][j]=INF;
			if (karte[i]<=j && opt[i-1][j-karte[i]] != INF
				&& manji(opt[i-1][j-karte[i]]+1,opt[i-1][j])
                && opt[i-1][j-karte[i]]+1 <= x)
            {
					opt[i][j] = opt[i-1][j-karte[i]]+1;
			}
			else
				opt[i][j] = opt[i-1][j];
		}
	}

	printf("Optimalna vrednost u rancu je %d.\n", opt[n][z]);

	//Rekonstrukcija
	printf("Predmeti u rancu su:\n");
	i=n; j=z;
	while (opt[i][j]!=0) {
		if (opt[i][j] == opt[i-1][j]) {
			i--;
		}
		else {
			printf("%d ", i);
			j -= karte[i];
			i--;
		}
	}
	printf("\n");

	return 0;

}









