#include<algorithm>//sort,二分探索,など
#include<bitset>//固定長bit集合
#include<cmath>//pow,logなど
#include<complex>//複素数
#include<deque>//両端アクセスのキュー
#include<functional>//sortのgreater
#include<iomanip>//setprecision(浮動小数点の出力の誤差)
#include<iostream>//入出力
#include<iterator>//集合演算(積集合,和集合,差集合など)
#include<map>//map(辞書)
#include<numeric>//iota(整数列の生成),gcdとlcm(c++17)
#include<queue>//キュー
#include<set>//集合
#include<stack>//スタック
#include<string>//文字列
#include<unordered_map>//イテレータあるけど順序保持しないmap
#include<unordered_set>//イテレータあるけど順序保持しないset
#include<utility>//pair
#include<vector>//可変長配列

using namespace std;
typedef long long ll;

//マクロ
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=(ll)(n)-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=(a);i<=(b);i++)
#define FORD(i,a,b) for(ll i=(a);i>=(b);i--)
#define ALL(x) (x).begin(),(x).end() //sortなどの引数を省略したい
#define SIZE(x) ((ll)(x).size()) //sizeをsize_tからllに直しておく
#define INF 1000000000000 //10^12
#define MOD 10000007 //10^9+7
#define PB push_back

template<typename T, typename U, typename Comp=less<>>
bool chmax(T& xmax, const U& x, Comp comp={}) {
    if(comp(xmax, x)) {
        xmax = x;
        return true;
    }
    return false;
}

template<typename T, typename U, typename Comp=less<>>
bool chmin(T& xmin, const U& x, Comp comp={}) {
    if(comp(x, xmin)) {
        xmin = x;
        return true;
    }
    return false;
}

ll gcd(ll a, ll b){
    if(a % b == 0){
        return(b);
    }
    else{
        return(gcd(b, a % b));
    }
}

//scanf("%lld", &);
//cin >> ;
//cout << ans << endl;

/*
    再起的にA数列を作成し、vectorに格納？。
    
    最初、空のAs, 空のa, M, Nが格納
    aはforでi ~ M まで回し、再帰

    格納されれば、正しいものが生成されている
*/
void gA(vector<vector<int>>&As, vector<int> a, int M, int N){
    // 先頭で、a数列のサイズがNに達している or 最後の値がM でreturn
    if (a.size() == N){
        As.push_back(a);
        return;
    }
    int lastVal = a.at(a.size() - 1);

    a.push_back(-100); //変動させる最後の値を追加 
    int aLast = a.size() - 1; // 何度も呼び出すので格納

    // 数列作り　現在の最終値から、M以下まで、1つを追加したパターンを生成する
    for (int i = lastVal; i <= M; i++){
        a.at(aLast) = i;
        gA(As, a, M, N);
    }
    // 追加し終えればここへ。
}

int N, M, K, Q, i, j, k, l, tmp, ans;

int main(){
    cin >> N >> M >> Q;

    vector<int> a(Q,0), b(Q,0), c(Q,0), d(Q,0);

    REP(i, Q){
        cin >> a.at(i) >> b.at(i) >> c.at(i) >> d.at(i);
    }

    vector<vector<int>> As;
    vector<int> a_init(1,0);//初期値０を1つだけ格納

    // 生成処理
    for (int i = 1; i <= M; i++){
        a_init.at(0) = i;
        gA(As, a_init, M, N);
    }

    //Asが存在しなければ失敗
    if (As.size() == 0){
        cout << 0;
        return 0;
    }
    // 存在する場合、得点計算
    
    // デバッグ用、配列出力
    /*
    cout << "-----------------------" << endl;
    REP(i, As.size()){
        REP(j, As.at(i).size()){
            cout << As.at(i).at(j) << " ";
        }
        cout << endl;
    }
    cout << "-----------------------" << endl;
    cout << Q << endl;
    cout << a.size() << endl;
    cout << b.size() << endl;
    cout << c.size() << endl;
    cout << d.size() << endl;
    cout << "-----------------------" << endl;
    */

    //得点計算 Abi - Aai = ci score+=di
    int maxScore = 0;
    REP(i, As.size()){
        int calcScore = 0;
        vector<int> *pA = &As.at(i);
        REP(j, Q){
            if ( (pA->at(b[j] - 1) - pA->at(a[j] - 1)) == c[j]){
     //           cout << j << endl;
                calcScore += d.at(j);
            }
        }
        if (maxScore < calcScore){
            maxScore = calcScore;
        }
    //    cout << "---" << endl;
    }

    cout << maxScore << endl;

    return 0;
}

Measured memory_bytes: 9836