module UF = struct
  type node = {
    mutable par: int;
    mutable rank: int;
  };;


  let make n = Array.init n (fun i -> { par = i; rank = 0 })
  ;;

  (* 根を求める *)
  let rec find uf x =
    if uf.(x).par == x
    then x
    else
      let par = uf.(x).par in
      let v = find uf par in
      uf.(x).par <- v;
      v
  ;;

  (* xとyの集合を併合 *)
  let unite uf x y =
    let x = find uf x in
    let y = find uf y in
    if x != y then
      if uf.(x).rank < uf.(y).rank
      then (
        uf.(x).par <- y;
        ()
      )
      else (
        uf.(y).par <- x;
        if uf.(x).rank == uf.(y).rank then (
          uf.(x).rank <- uf.(x).rank + 1;
          ()
        )
      )
  ;;

  let some uf x y = find uf x == find uf y
  ;;
end

let dec x = x -1
;;

let tuple2map fa fb (a, b) = (fa a, fb b)
;;

let tuple2 a b = (a, b)
;;

let curry2 f a b = f (a, b)
;;

let uncurry2 f (a, b) = f a b
;;

let (>>) f g x = g (f x)
;;

let (>>>) f g x y = g (f x y)
;;

let list_init n f = Array.init n f |> Array.to_list
;;

let tuple3 a b c = (a, b, c)
;;

let tuple4 a b c d = (a, b, c, d)
;;

let rec f a_list min n m list =
  if Array.length a_list == n
  then
    list
    |> List.filter_map
      (fun (a, b, c, d) -> if a_list.(b-1) - a_list.(a-1) == c then Option.some d else Option.none) 
    |> List.fold_left (+) 0
  else
    List.init (m - min + 1) ((+) min)
    |> List.map (fun min -> f (Array.append a_list [|min|]) min n m list)
    |> List.fold_left max 0
;;

let () =
  let n, m, q = Scanf.scanf "%d %d %d\n" tuple3 in
  let list = list_init q (fun _ -> Scanf.scanf "%d %d %d %d\n" tuple4) in
  let res = f [||] 1 n m list in
  Printf.printf "%d\n" res
;;
