#include <bits/stdc++.h>
using namespace std;
#define int long long
using vec_int = vector<int>;
using P = pair<int,int>;
using T = tuple<int,int,int>;
using ll = long long;
#define rep(i, n) for(int i = 0; i < (int)(n); i++)

int charToInt(char c){
    char zero_num = '0';
    return (int)c - (int)zero_num;
}

signed main(){
    int R, C, K; cin>>R>>C>>K;
//    vec_int r(K), c(K), v(K);
    vector<vector<int>> val_map(R, vector<int>(C, 0));

    rep(i, K){
//        cin>>r.at(i)>>c.at(i)>>v.at(i);
        int r, c, v; cin>>r>>c>>v;
        val_map.at(r-1).at(c-1) = v;
    }

    vector<vector<vector<int >>>DP(R, vector<vector<int>>(C, vector<int>(4,0)));
    for(int i=0;i<R;i++){
        for(int j=0;j<C;j++){
            if(i==0 && j==0){
                //スタート地点では拾うか判定するだけ
                if(val_map.at(i).at(j)>0){
                    DP.at(i).at(j).at(1) = val_map.at(i).at(j);
                }
            }else if(i==0){
                int val = val_map.at(i).at(j);
                if(val>0){
                    //アイテムが落ちているとき
                    //拾ったほうが良いか判断する
                    for(int k=1;k<4;k++){
                        if(DP.at(i).at(j-1).at(k)<DP.at(i).at(j-1).at(k-1)+val){
                            DP.at(i).at(j).at(k) = DP.at(i).at(j-1).at(k-1)+val;
                        }else{
                            DP.at(i).at(j).at(k) = DP.at(i).at(j-1).at(k);
                        }
                    }
                }else{
                    //落ちていないときにはそのままコピーしてくればよい
                    for(int k=1;k<4;k++){
                        DP.at(i).at(j).at(k) = DP.at(i).at(j-1).at(k);
                    }
                }
            }else{
                int val = val_map.at(i).at(j);
                int max_ue = 0;
                for(int k=0;k<4;k++){
                    if(DP.at(i-1).at(j).at(k)>max_ue){
                        max_ue = DP.at(i-1).at(j).at(k);
                    }
                }

                if(j==0){
                    DP.at(i).at(j).at(0) = max_ue;
                    if(val>0){
                        DP.at(i).at(j).at(1) = DP.at(i).at(j).at(0) + val;
                    }
//                    continue;
                }else{
                    DP.at(i).at(j).at(0) = DP.at(i).at(j-1).at(0);
                    if(DP.at(i).at(j).at(0)<max_ue){
                        DP.at(i).at(j).at(0) = max_ue;
                    }
                    if(val>0){
                    for(int k=1;k<4;k++){
                        if(DP.at(i).at(j-1).at(k)<DP.at(i).at(j-1).at(k-1)+val){
                            DP.at(i).at(j).at(k) = DP.at(i).at(j-1).at(k-1)+val;
                        }else{
                            DP.at(i).at(j).at(k) = DP.at(i).at(j-1).at(k);
                        }
                    }
                    if(DP.at(i).at(j).at(1)<max_ue+val){
                        DP.at(i).at(j).at(1) = max_ue + val;
                    }
                    }else{
                        for(int k=1;k<4;k++){
                            DP.at(i).at(j).at(k) = DP.at(i).at(j-1).at(k);
                        }
                    }
                }
            }
            /*
            cout<<i<<" "<<j<<" "<<DP[i][j][0]<<endl;
            cout<<i<<" "<<j<<" "<<DP[i][j][1]<<endl;
            cout<<i<<" "<<j<<" "<<DP[i][j][2]<<endl;
            cout<<i<<" "<<j<<" "<<DP[i][j][3]<<endl;
            */



        }
    }

    int max_val = 0;
    for (int k = 0; k < 4; k++)
    {
        if (DP.at(R - 1).at(C-1).at(k) > max_val)
        {
            max_val = DP.at(R - 1).at(C-1).at(k);
        }
    }
    cout<<max_val<<endl;

    return 0;
}

Measured memory_bytes: 706688