#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key

typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;

ll a[100001][2];
vector<ii> adj[100001][2];
bool visited[100001][2];
const ll INF = ll(1e18);
const ll INF2 = ll(1e15);
ii relax(ii x, ii y)
{
	return mp(min(x.fi, y.fi), min(x.se, y.se));
}

ii dfs(int u, bool s)
{
	ii ans = mp(INF, INF);
	for(int i = 0; i < adj[u][s].size(); i++)
	{
		int v = adj[u][s][i].fi; ll w = adj[u][s][i].se;
		//cerr << v << ' ' << w << '\n';
		if(a[v][(s^1)] != -1)
		{
			if(a[v][(s^1)] + a[u][s] != w) return mp(-1, -1);
			if(s) ans = relax(ans, mp(a[v][(s^1)], a[u][s]));
			else ans = relax(ans, mp(a[u][s], a[v][(s^1)]));
		}
		else
		{
			a[v][(s^1)] = w - a[u][s];
			//cerr << v << ' ' << (s^1) << ' ' << a[v][(s^1)] << '\n';
			ii tmp = dfs(v, (s^1));
			ans = relax(ans, tmp);
		}
	}
	return ans;
}

void dfs2(int u, bool s, ll shift)
{
	visited[u][s] = true;
	for(int i = 0; i < adj[u][s].size(); i++)
	{
		int v = adj[u][s][i].fi;
		if(visited[v][(s^1)]) continue;
		else
		{
			if(s) a[v][(s^1)] -= shift;
			else a[v][(s^1)] += shift;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	int R, C, n;
	cin>>R>>C>>n;
	memset(a, -1, sizeof(a));
	ll a0 = 0; bool forced = false;
	for(int i = 0; i < n; i++)
	{
		int x, y; ll val;
		cin>>x>>y>>val;
		if(x == 1 && y == 1)
		{
			a0 = val; forced = true;
		}
		adj[x][0].pb(mp(y, val));
		adj[y][1].pb(mp(x, val));
		//ma[ii(x, y)] = val;
		//vec.pb(ii(x, y));
	}
	/*
	a[1][0] = a0; a[1][1] = a0;
	for(int i = 1; i <= max(R, C); i++)
	{
		for(int j = 0; j < 2; j++)
		{
			if(i > R && j == 0) continue;
			if(i > C && j == 1) continue;
			for(int k = 0; k < adj[i][j].size(); k++)
			{
				adj[i][j][k].se += a0;
			}
		}
	}
	*/
	for(int i = 1; i <= max(R, C); i++)
	{
		for(int j = 0; j < 2; j++)
		{
			if(i > R && j == 0) continue;
			if(i > C && j == 1) continue;
			if(a[i][j] == -1) a[i][j] = 0;
			ii tmp = dfs(i, j);
			//cerr << i << ' ' << j << ' ' << tmp.fi << ' ' << tmp.se << '\n';
			/*
			if(i == 1 && forced)
			{
				if(tmp.fi < 0 || tmp.se < 0)
				{
					cout << "No\n"; return 0;
				}
			}
			*/
			if(1) 
			{
				if(tmp.fi + tmp.se < 0)
				{
					cout << "No\n"; return 0;
				}
				/*
				else if(tmp.fi < 0 || tmp.se < 0)
				{
					ll shift = 0;
					if(tmp.fi < 0) shift = -tmp.fi;
					else shift = tmp.se;
					//cerr << tmp.fi << ' ' << tmp.se << ' ' << shift << '\n';
					dfs2(i, j, shift);
				}
				*/
			}
		}
	}
	/*
	for(int i = 1; i <= max(R, C); i++)
	{
		for(int j = 0; j < 2; j++)
		{
			if(i > R && j == 0) continue;
			if(i > C && j == 1) continue;
			cerr << i << ' ' << j << ' ' << a[i][j] << '\n';
		}
	}
	*/
	for(int i = 1; i <= R; i++)
	{
		if(a[i][0] == -1) a[i][0] = INF2;
	}
	for(int i = 1; i <= C; i++)
	{
		if(a[i][1] == -1) a[i][1] = INF2;
	}
	ll mina = INF; ll minb = INF;
	/*
	for(int i = 1; i <= R; i++) mina = min(mina, a[i][0]);
	for(int i = 1; i <= C; i++) minb = min(minb, a[i][1]);
	*/
	if(mina + minb >= a0) cout << "Yes\n";
	else cout << "No\n";
}


Measured memory_bytes: 21120