#include <bits/stdc++.h>

using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using usize = std::size_t;
using namespace std;

#define rep(i, max) for(usize i = 0; i < max; ++i)
#define loop while(true)
#define allOf(collection) collection.begin(), collection.end()

unique_ptr<string> readLine() { unique_ptr<string> line(new string()); getline(cin, *line); return move(line); }
template<typename T1, typename T2> pair<T1, T2> readPair() { T1 res1; cin >> res1; T2 res2; cin >> res2; readLine(); return make_pair(res1, res2);}
template<typename T> unique_ptr<vector<T>> readVector(usize num) { unique_ptr<vector<T>> list(new vector<T>(num)); rep(i, num) cin >> (*list)[i]; readLine(); return move(list); }
void readValues() { readLine(); }
template<typename H, typename... T> void readValues(H& head, T&&... tails){ H a; cin >> a; head = a; readValues(forward<T>(tails)...); }
void writeLine() { cout << endl; }
template<typename T> void write(const T& arg) { cout << arg; }
template<typename T> void writeLine(const vector<T>& arg){ if(arg.empty()) { writeLine(); return; } write(arg[0]); for(int i = 1; i < arg.size(); ++i){ write(" "); write(arg[i]); } writeLine(); }
template<typename T> void writeLine(const T& arg) { cout << arg << endl; }
void recursiveCombination(vector<i32>& indexes, i32 s, i32 rest, function<void(vector<i32>&)> f) { if (rest == 0) { f(indexes); } else { if (s < 0) return; recursiveCombination(indexes, s - 1, rest, f); indexes[rest - 1] = s; recursiveCombination(indexes, s - 1, rest - 1, f); } }
void foreachWithCombination(i32 n, i32 k, function<void(vector<i32>&)> f) { auto indexes = vector<i32>(k); recursiveCombination(indexes, n - 1, k, f); }
void foreachWithPermutaton(i32 n, function<void(vector<i32>&)> f) { auto indexes = vector<i32>(); indexes.reserve(n); rep(i, n) indexes.push_back(i); do f(indexes); while (next_permutation(allOf(indexes))); }
void foreachWithPermutaton(i32 n, i32 k, function<void(vector<i32>&)> f){ foreachWithCombination(n, k, [=](vector<i32>& combIndexes){ foreachWithPermutaton(k, [=](vector<i32>& permIndexes){ auto indexes = vector<i32>(); indexes.reserve(k); rep(i, k){ indexes.push_back(combIndexes[permIndexes[i]]); } f(indexes); }); }); }
void program();
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    program();
}

void serachResult(vector<i32> value, int index, int mini, int maxi);

int n; int m; int q;
vector<tuple<i32, i32, i32, i32>> tuples;
i32 scoreMaxi = 0;

void program() {
    readValues(n, m, q);
    tuples = vector<tuple<i32, i32, i32, i32>>();
    tuples.reserve(q);
    rep(i, q){
        int a, b, c, d;
        readValues(a, b, c ,d);
        tuples.push_back(make_tuple(a, b, c, d));
    }

    auto initialArray = vector<i32>(n);
    fill(allOf(initialArray), 1);
    serachResult(initialArray, initialArray.size() - 1, 1, m);
    writeLine(scoreMaxi);
}

void serachResult(vector<i32> value, int index, int mini, int maxi) {
    if(index > 0){
        for(int i = mini; i <= maxi; ++i){
            value[index] = i;
            serachResult(value, index - 1, value[index - 1], i);
        }
    }else{
        for(int i = mini; i <= maxi; ++i){
            value[index] = i;
            i32 sum = 0;
            rep(j, q){
                if(value[get<1>(tuples[j]) - 1] - value[get<0>(tuples[j]) - 1] == get<2>(tuples[j]))
                sum += get<3>(tuples[j]);
            }
            scoreMaxi = max(scoreMaxi, sum);
        }
    }
}

Measured memory_bytes: 3616