#include<bits/stdc++.h>
using
namespace
std;
int
ex_worker[501];
int
ex_job[501];
int
used_worker[501];
int
used_job[501];
int
value[501][501];
int
do_the_job[501];
int
have[501];
int
n,m,k;
int
find(
int
worker)
{
used_worker[worker]=1;
for
(
int
job=1;job<=m;job++)
{
if
(used_job[job])
continue
;
int
gap=ex_worker[worker]+ex_job[job]-value[worker][job];
if
(gap==0)
{
used_job[job]=1;
if
(do_the_job[job]==-1||find(do_the_job[job]))
{
do_the_job[job]=worker;
return
1;
}
}
else
have[job]=min(have[job],gap);
}
return
0;
}
int
main()
{
cin>>n>>m>>k;
for
(
int
i=1;i<=k;i++)
{
int
x,y,v;
cin>>x>>y>>v;
value[x][y]=max(value[x][y],v);
}
for
(
int
i=1;i<=n;i++)
{
for
(
int
j=1;j<=m;j++)
{
ex_worker[i]=max(ex_worker[i],value[i][j]);
}
}
for
(
int
i=1;i<=n;i++)
{
do_the_job[i]=-1;
}
for
(
int
i=1;i<=n;i++)
{
for
(
int
kk=1;kk<=m;kk++)have[kk]=4001234567;
while
(1)
{
for
(
int
j=1;j<=max(n,m);j++)
{
used_worker[j]=0;
used_job[j]=0;
}
if
(find(i))
break
;
int
d=4001234568;
for
(
int
j=1;j<=m;j++)
{
if
(!used_job[j])
d=min(d,have[j]);
}
for
(
int
j=1;j<=n;j++)
{
if
(used_worker[j])ex_worker[j]-=d;
}
for
(
int
j=1;j<=m;j++)
{
if
(used_job[j])ex_job[j]+=d;
else
have[j]-=d;
}
}
}
int
sycc=0;
for
(
int
i=1;i<=m;i++)
{
if
(do_the_job[i]!=-1)
{
sycc+=value[do_the_job[i]][i];
}
}
cout<<sycc<<
"\n"
;
}