#include<stdio.h>
#include<stdlib.h>
int ROW_INDEX = 1;
//[min_range, max_range]からn_ints個の整数の組をすべてとりだしcomb[組][整数]に格納する
void AllCombs_ints(int min_range, int max_range, int depth, int n_ints, int **comb){
	if(depth > 0){
		for(int x = min_range; x <= max_range; x++){
			//comb[0]を一時的な格納場所として使っている。気持ち悪い。
			comb[0][depth-1] = x;
			if(depth == 1){
				for(int num_i = 1; num_i <= n_ints; num_i++)
					comb[ROW_INDEX][num_i-1] = comb[0][n_ints-num_i];
				ROW_INDEX++;
			}
			AllCombs_ints(x, max_range, depth - 1, n_ints, comb);
		}
	}
	if(depth == n_ints)
		ROW_INDEX = 1;
}
long int Factorial(int upto){
	if(upto == 0)
		return 1;
	return upto * Factorial(upto - 1);
}
int main(){
	int N, M, Q;
	scanf("%d %d %d", &N, &M, &Q);
	int mat[Q][4], **pt_srs;
	long int n_combs = Factorial(N+M-1) / Factorial(N) / Factorial(M-1);
	pt_srs = (int **) malloc(sizeof(int *) * (n_combs + 1));
	for(int pt_i = 0; pt_i <= n_combs; pt_i++)
		pt_srs[pt_i] = (int *) malloc(sizeof(int) * N);
	AllCombs_ints(1, M, N, N, pt_srs);
	for(int i = 0; i < Q; i++)
		for(int j = 0; j < 4; j++)
			scanf("%d", &mat[i][j]);

	long int ans = 0;
	for(int pt_i = 1; pt_i <= n_combs; pt_i++){
		int ans_temp = 0;
		for(int abcd_i = 0; abcd_i < Q; abcd_i++)
			if(pt_srs[pt_i][mat[abcd_i][1]-1]-pt_srs[pt_i][mat[abcd_i][0]-1] == mat[abcd_i][2])
				ans_temp += mat[abcd_i][3];
		if(ans_temp > ans)
			ans = ans_temp;
	}
	printf("%ld", ans);

	for(int pt_i = 0; pt_i <= n_combs; pt_i++)
		free(pt_srs[pt_i]);
	free(pt_srs);
	return 0;
}