using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
using static System.Math;

class MainClass : Scanner
{
    static void Main()
    {
        var (R, C, K) = ReadTuple<int,int,int>();
        var map = new long[R, C];
        for (int i = 0; i < K; i++)
        {
            var r = RInts();
            r[0]--;r[1]--;
            map[r[0], r[1]] = r[2];
        }
        var dp = new long[R, C, 4];
        for (int i = 0; i < R; i++)
        {
            for (int j = 0; j < C; j++)
            {
                for (int k = 3; k >= 0; k--)
                {
                    int nj = Min(j + 1, C - 1);
                    int ni = Min(i + 1, R - 1);
                    long nv = dp[i, j, k] + map[i, j];
                    long v = dp[i, j, k];

                    if (k == 3)
                    {
                        if(i!=ni)
                            dp[ni, j, 0] = Max(dp[ni, j, k], v);
                        if(j!=nj)
                            dp[i,nj,k] = Max(dp[i,nj,k],v);
                        continue;
                    }
                    if (i != ni)
                    {
                        dp[ni, j, 0] = Max(dp[ni, j, 0], nv);
                    }
                    if (j != nj)
                    {
                        dp[i, nj, k] = Max(dp[i, nj, k], v);
                        dp[i, nj, k + 1] = Max(dp[i, nj, k + 1], nv);
                    }
                    
                    dp[i, j, k + 1] = Max(dp[i, j, k + 1], nv);
                    //dp[ni, j, 0] = Max(dp[ni, j, 0], v);
                }
            }
        }
        long ans = 0;
        for (int i = 0; i <= 3; i++)
        {
            ans = Max(ans, dp[R - 1, C - 1, i]);
        }
        WriteLine(ans);
    }
}



class Scanner
{
    public static string RString() => Console.ReadLine();
    public static int RInt() => ReadTuple<int>();
    public static long RLong() => ReadTuple<long>();
    public static double RDouble() => ReadTuple<double>();

    public static string[] RStrings() => Console.ReadLine().Split();
    public static int[] RInts() => Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
    public static long[] RLongs() => Array.ConvertAll(Console.ReadLine().Split(), long.Parse);
    public static double[] RDoubles() => Array.ConvertAll(Console.ReadLine().Split(), double.Parse);
    public static int[] RInts(Func<string, int> func) => Console.ReadLine().Split().Select(func).ToArray();
    public static long[] RLongs(Func<string, long> func) => Console.ReadLine().Split().Select(func).ToArray();
    public static double[] RDoubles(Func<string, double> func) => Console.ReadLine().Split().Select(func).ToArray();
    //public static string[] RStrings(Func<string, string> func) => Console.ReadLine().Split().Select(func).ToArray();

    public static T1 ReadTuple<T1>()
    {
        var r = RString();
        var r1 = (T1)Convert.ChangeType(r, typeof(T1));
        return r1;
    }
    public static (T1, T2) ReadTuple<T1, T2>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        var r2 = (T2)Convert.ChangeType(r[1], typeof(T2));
        return (r1, r2);
    }
    public static (T1, T2, T3) ReadTuple<T1, T2, T3>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        var r2 = (T2)Convert.ChangeType(r[1], typeof(T2));
        var r3 = (T3)Convert.ChangeType(r[2], typeof(T3));
        return (r1, r2, r3);
    }
    public static (T1, T2, T3, T4) ReadTuple<T1, T2, T3, T4>()
    {
        var r = RStrings();
        var r1 = (T1)Convert.ChangeType(r[0], typeof(T1));
        var r2 = (T2)Convert.ChangeType(r[1], typeof(T2));
        var r3 = (T3)Convert.ChangeType(r[2], typeof(T3));
        var r4 = (T4)Convert.ChangeType(r[3], typeof(T4));
        return (r1, r2, r3, r4);
    }
}


Measured memory_bytes: 397984