#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>pii;
vector<pii>pat[200000];
vector<pii>dat[100000][2];
ll d[200000];
#define INF 2000000000000000000LL
bool flag[200000];
bool isok=true;
ll mix=INF,miy=INF;
void dfs(int node,ll now)
{
	if(flag[node])
	{
		if(now!=d[node])isok=false;
		return;
	}
	flag[node]=true;
	d[node]=now;
	if(node%2==0)mix=min(mix,now);
	else miy=min(miy,now);
	for(int i=0;i<pat[node].size();i++)
	{
		if(node%2==pat[node][i].first%2)dfs(pat[node][i].first,pat[node][i].second+now);
		else dfs(pat[node][i].first,pat[node][i].second-now);
	}
}
int main()
{
	int mx,my,num;
	scanf("%d%d%d",&mx,&my,&num);
	for(int i=0;i<num;i++)
	{
		int za,zb,zc;
		scanf("%d%d%d",&za,&zb,&zc);
		za--,zb--;
		pat[za*2].push_back(make_pair(zb*2+1,zc));
		pat[zb*2+1].push_back(make_pair(za*2,zc));
		dat[za][0].push_back(make_pair(zb,zc));
		dat[zb][1].push_back(make_pair(za,zc));
	}
	for(int i=0;i<100000;i++)
	{
		for(int j=1;j<dat[i][0].size();j++)
		{
			pat[dat[i][0][j-1].first*2+1].push_back(make_pair(dat[i][0][j].first*2+1,dat[i][0][j].second-dat[i][0][j-1].second));
			pat[dat[i][0][j].first*2+1].push_back(make_pair(dat[i][0][j-1].first*2+1,dat[i][0][j-1].second-dat[i][0][j].second));
		}
		for(int j=1;j<dat[i][1].size();j++)
		{
			pat[dat[i][1][j-1].first*2].push_back(make_pair(dat[i][1][j].first*2,dat[i][1][j].second-dat[i][1][j-1].second));
			pat[dat[i][1][j].first*2].push_back(make_pair(dat[i][1][j-1].first*2,dat[i][1][j-1].second-dat[i][1][j].second));
		}
	}
	/*for(int i=0;i<4;i++)
	{
		for(int j=0;j<pat[i].size();j++)printf("%d %lld   %lld\n",i,pat[i][j].first,pat[i][j].second);
	}*/
	fill(flag,flag+200000,false);
	fill(d,d+200000,0);
	for(int i=0;i<200000;i++)
	{
		if(!flag[i])
		{
			mix=miy=INF;
			dfs(i,0);
			if(mix+miy<0)isok=false;
		}
		//if(i<=6)printf("%d %lld\n",i,d[i]);
	}
	if(isok)printf("Yes\n");
	else printf("No\n");
}