#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";
}