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

int main() {
	int *opt, *pred;
	int n, m;
	int *zapr, *vred, *kolicine;
	int v, i;
	
	//Unos zapremine ranca i broja predmeta
	scanf("%d",&m);
	
	zapr = (int *)malloc((m+1)*sizeof(int));
	vred = (int *)malloc((m+1)*sizeof(int));
	kolicine = (int *)malloc((m+1)*sizeof(int));
	
	//Unos zapremina predmeta
	for (i=1; i<=m; i++) {
		scanf("%d",&zapr[i]);
		kolicine[i] = 0;
	}
	
	//Unos vrednosti predmeta
	for (i=1; i<=m; i++) {
		scanf("%d",&vred[i]);
		vred[i] -= zapr[i];
	}
		
	scanf("%d", &n);
		
	//Alociranje nizova
	opt = (int *)malloc((n+1)*sizeof(int)); 	// opt[v] - vrednost u optimalno popunjenom rancu zapremine v
	pred = (int *)malloc((n+1)*sizeof(int));	// pred[i] - poslednji predmet stavljen u ranac da bi se dopunio do zapremine v.
	
	//Racunanje optimuma
	opt[0] = 0;
	pred[0] = 0;
	
	//Po zapreminama
	for (v=1; v<=n; v++) {	//Popunjavaju se sve zapremine v od 1 do n
		opt[v] = 0; pred[v] = 0;
		//Po predmetima
		for (i=1; i<=m; i++) {	//Proveravaju se svi predmeti i od 1 do m
			if (zapr[i]<=v) {
				if (vred[i]+opt[v-zapr[i]] > opt[v]) {
					opt[v] = vred[i]+opt[v-zapr[i]];
					pred[v] = i;
				}
			}
		}
	}
	
	printf("%d\n", opt[n]);
	
	//Rekonstrukcija
	i=n;
	while(pred[i]>0) {
		kolicine[pred[i]]++;
		i -= zapr[pred[i]];
	}
	for (i=1; i<=m; i++) {
		if (kolicine[i]>0) {
			printf("%d %d\n", i, kolicine[i]);
		}
	}
	printf("\n");
	
	return 0;
	
}













