// #include <bits/stdc++.h>
// #define rep(i,a,b) for(ll i=a;i<b;i++)
// #define rrep(i,b,a) for(ll i=b;i>=a;i--)
// #define fori(a) for(auto i : a )
// #define all(a) begin(a), end(a)
// #define set(a,b) memset(a,b,sizeof(a))
// #define sz(a) a.size()
// #define pi 3.14159
// #define ll long long
// #define ull unsigned long long
// #define pb push_back
// #define PF push_front //deque
// #define mp make_pair
// #define pq priority_queue
// #define mod 1000000007
// #define f first
// #define s second
// #define pii pair< ll, ll >
// #define vi vector<ll>
// #define vpii vector<pii>
// #define debug(v) for(auto i:v) cout<<i<<" ";
// #define tc ll t; cin >> t; while(t--)
//
// using namespace std;
// string repeat(string s, ll n) {
//     string s1 = "";
//     for (ll i=0; i<n;i++)
//         s1+=s;
//     return s1;
// }
// string getString(char x) {
//     string s(1, x);
//     return s;
// }
//
// void optimizeIO(){
//     ios_base::sync_with_stdio(false);
//     cin.tie(NULL);
//     cout.tie(NULL);
// }
// ll gcd(ll a, ll b){
//     if (a == 0)  return b;
//     return gcd(b % a, a);
// }
// const int N=3005;
// vector<vector<ll>> a(N,vector<ll>(N,0));
// ll dp[N][N][4];
// void solve(){
//   ll r,c,k,x,y,v;
//   cin>>r>>c>>k;
//   rep(i,0,k){
//     cin>>x>>y>>v;
//     a[x-1][y-1]=v;
//   }
//   rep(i,0,r) rep(k,0,4)dp[i][0][k]=0;
//   rep(i,0,c) rep(k,0,4) dp[0][i][k]=0;
//   dp[0][0][0]=a[0][0];
//   rep(i,1,c){
//     vector<ll> v1={dp[0][i-1][0],dp[0][i-1][1],dp[0][i-1][2],a[0][i]};
//     sort(all(v1),greater<ll>());
//     rep(k,0,3) dp[0][i][k]=v1[k];
//   }
//   rep(i,1,r){
//     ll sum1=(dp[i-1][0][0]+dp[i-1][0][1]+dp[i-1][0][2]+dp[i-1][0][3]);
//     dp[i][0][0]=a[i][0];
//     dp[i][0][3]=sum1;
//   }
//   rep(i,1,r){
//     rep(j,1,c){
//       ll sum=dp[i][j-1][0]+dp[i][j-1][1]+dp[i][j-1][2]+dp[i][j-1][3];
//       ll sum1=(dp[i-1][j][0]+dp[i-1][j][1]+dp[i-1][j][2]+dp[i-1][j][3]);
//       if(sum>sum1 ){
//         vector<ll> v1={dp[i][j-1][0],dp[i][j-1][1],dp[i][j-1][2],a[i][j]};
//         sort(all(v1),greater<ll>());
//         rep(k,0,3) dp[i][j][k]=v1[k];
//         dp[i][j][3]=dp[i][j-1][3];
//       }
//       else{
//         dp[i][j][0]=a[i][j];
//         rep(k,1,3) dp[i][j][k]=0;
//         dp[i][j][3]=sum1;
//       }
//     }
//   }
//   cout<<dp[r-1][c-1][0]+dp[r-1][c-1][1]+dp[r-1][c-1][2]+dp[r-1][c-1][3]<<endl;
// }
// int main(){
//     optimizeIO();
//     // tc
//     { solve();
//     }
// }


#ifndef LOCAL
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#endif
#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace std;
using namespace __gnu_pbds;
#define sim template < class c
#define int long long
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << '\n'; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);
typedef tree< pair<int,int>, null_type, less<pair<int,int> >, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef long long ll;
const ll MOD = 1e9 + 7 ;
const ll N = 2e5 + 10 ;
const ll INF = 1e18 + 10 ;
int n , m , k ;
int a[3001][3001] ;
int dp[3001][3001][4] ;
int dfs(int x, int y, int cur){
    if ( x == n && y == m ) {
        return 0 ;
    }
    if ( x == n ) return 0 ;
    if ( y == m ) return 0 ;
    if ( dp[x][y][cur] != -1 ) return dp[x][y][cur] ;
    int ans = 0 ;
    if ( a[x][y] == 0 ) {
        ans = max(dfs(x + 1, y, 0), dfs(x, y + 1, cur)) ;
    }
    else{
        int value = a[x][y] ;
        if ( cur < 3 ) {
            ans = max(ans, value + dfs(x, y + 1, cur + 1)) ;
            ans = max(ans, value + dfs(x + 1, y, 0)) ;
        }
        ans = max(ans, dfs(x, y + 1, cur)) ;
        ans = max(ans, dfs(x + 1, y, 0)) ;
    }
    return dp[x][y][cur] = ans ;
}
signed main(){
    fastio
    memset(dp, -1, sizeof dp) ;
    cin >> n >> m >> k ;
    for(int i = 0; i < k; i++){
        int x , y , z;
        cin >> x >> y >> z ;
        x--, y-- ;
        a[x][y] = z ;
    }
    int ans = dfs(0, 0, 0) ;
    cout << ans << endl;
    return 0;
}


Measured memory_bytes: 355760