// WA

// #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();
//     }
// }

// Method 2:AC
// #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] ;
// // The transitions are:
// // if curNoOfItems is 3, then we only can go to the next row, and reset number of items to zero.
// // if curNoOfItems less than 3: we have four options:
// // Either we do not take it and move to the next item in the same row.
// // Either we do not take it and move to the next row and resetting number of items to zero.
// // Either we do take it and move to the next item in the same row (increasing no of items by 1)
// // Either we do take it and move to the next row and resetting number of items to zero.
//
// 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;
// }

// Method 3: AC
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
#define pb push_back
#define deb(x) cout<<x<<"\n";
#define deB(x,y) cout<<x<<" "<<y<<"\n";
#define Deb(x,y,z) cout<<x<<" "<<y<<" "<<z<<"\n";
#define YES cout<<"YES\n";
#define Yes cout<<"Yes\n";
#define NO cout<<"NO\n";
#define No cout<<"No\n";
#define clt(x) 63-__builtin_clzll(x)
#define bct(x) __builtin_popcountll(x)
#define all(v) (v).begin(),(v).end()
#define pi pair<ll,ll>
#define vi vector<ll>
#define vpi vector<pair<ll,ll>>
#define maxq priority_queue<ll>
#define minq priority_queue<ll,vector<ll>, greater<ll>>
#define cont continue;
#define reto return 0;
#define sz size()
#define spmod 1116295198451
#define mod 1000000007
#define md 998244353
#define N 3009
ll dp[N][N][4],a[N][N];
int main()
{
	ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
  ll n,m,k,i,j,v;
  cin>>n>>m>>k;
  while(k--)
  {
  	cin>>i>>j>>v;
  	a[i][j]=v;
  }
  i=n;
  while(i)
  {
  	j=m;
  	while(j)
  	{
  			dp[i][j][1]=max({dp[i][j+1][1],a[i][j],a[i][j]+max({dp[i+1][j][1],dp[i+1][j][2],dp[i+1][j][3]})});
  			dp[i][j][2]=max(dp[i][j+1][2],a[i][j]+dp[i][j+1][1]);
  			dp[i][j][3]=max(dp[i][j+1][3],a[i][j]+dp[i][j+1][2]);
  		j--;
  	}
  	i--;
  }
  deb(max({dp[1][1][1],dp[1][1][2],dp[1][1][3]}));
}


Measured memory_bytes: 356156