#include <iostream>
#include <sstream>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <queue>
#include <ctime>
#include <cassert>
#include <cstdio>
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
 
using namespace std;
 
#define fr first
#define sc second
#define mp make_pair
#define pb push_back
#define epr(...) fprintf(stderr, __VA_ARGS__)
#define db(x) cerr << #x << " = " << x << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n";
#define sz(a) (int)(a).size()
#define all(a) (a).begin(), (a).end()
 
#define equal equalll
#define less lesss

const int N = 2e5;
const int INF = 1e9 + 1;

vector<pair<int, int>> u[N], v[N];
vector<pair<int, int>> pt;
vector<int> cost;
int mnx[N], mn2x[N], mny[N], mn2y[N];
int r, c, n;
long long pot[N],pp[N], m1, m2;
bool used[N];
vector<pair<int, int>> g[N];

int getminy(int y, int val) {
	if (mny[y] == val) return mn2y[y];
	return mny[y];
}

int getminx(int x, int val) {
	if (mnx[x] == val) return mn2x[x];
	return mnx[x];
}

void check(int x) {
	if (x < 0) {
		puts("No");
		exit(0);
	}
}

void dfs(int x, long long cp) {
	if ((used[x]) && (cp != pot[x])) {
		puts("No");
		exit(0);
	}
	if (used[x]) return;
	m1 = min(m1, pp[x] - cp);
	m2 = min(m2, cp);
	used[x] = 1;
	pot[x] = cp;
	for (int i = 0; i < (int)g[x].size(); i++) {
		dfs(g[x][i].first, cp + g[x][i].second);
	}
}

void check1() {
	memset(used, 0, sizeof(used));
	vector<pair<int, int>> e;
	for (int i = 0; i < N; i++) {
		if (!g[i].empty()) e.push_back(make_pair(pp[i], i));
	}
	sort(e.begin(), e.end());
	for (int i = 0; i < (int)e.size(); i++) {
		int x = e[i].second;
		int y = e[i].first;
		m1 = m2 = INF;
		if (!used[x])  dfs(x, 0);
		if (m1 + m2 < 0) {
			puts("No");
			exit(0);
		}
	}
}

int main() {
	// freopen("input.txt", "r", stdin);
	scanf("%d%d", &r, &c);
	scanf("%d", &n);
	for (int i = 0; i < N; i++) {
		mnx[i] = mn2x[i] = mny[i] = mn2y[i] = INF;
	}
	for (int i = 0; i < n; i++) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		--x; --y;
		u[x].push_back(make_pair(y, z));
		v[y].push_back(make_pair(x, z));
		pt.push_back(make_pair(x, y));
		cost.push_back(z);
		if (z <= mnx[x]) {
			mn2x[x] = mnx[x];
			mnx[x] = z;
		} else if (z < mn2x[x]) {
			mn2x[x] = z;
		}
		if (z <= mny[y]) {
			mn2y[y] = mny[y];
			mny[y] = z;
		} else if (z < mn2y[y]) {
			mn2y[y] = z;
		}
	}

	for (int i = 0; i < N; i++) g[i].clear();
	for (int y = 0; y < N; y++) pp[y] = mny[y];
	for (int x = 0; x < N; x++) {
		if (u[x].empty()) continue;
		sort(u[x].begin(), u[x].end());
		for (int j = 0; j + 1 < (int)u[x].size(); j++) {
			int y = u[x][j].first;
			int z = u[x][j].second;
			int yy = u[x][j + 1].first;
			int zz = u[x][j + 1].second;
			g[y].push_back(make_pair(yy, zz - z));
			g[yy].push_back(make_pair(y, z - zz));
		}
	}
	check1();
	for (int x = 0; x < N; x++) pp[x] = mnx[x];
	for (int i = 0; i < N; i++) g[i].clear();
	for (int y = 0; y < N; y++) {
		if (v[y].empty()) continue;
		sort(v[y].begin(), v[y].end());
		for (int j = 0; j + 1 < (int)v[y].size(); j++) {
			int x = v[y][j].first;
			int z = v[y][j].second;
			int xx = v[y][j + 1].first;
			int zz = v[y][j + 1].second;
			g[x].push_back(make_pair(xx, zz - z));
			g[xx].push_back(make_pair(x, z - zz));
		}
	}
	check1();
	puts("Yes");
	exit(0);

	for (int i = 0; i < n; i++) {
		int x = pt[i].first;
		int y = pt[i].second;
		int z = cost[i];
		if (u[x].size() < v[y].size()) {
			for (int j = 0; j < (int)u[x].size(); j++) {
				int yy = u[x][j].first;
				int zz = u[x][j].second;
				if (yy == y) continue;
				int tmp = getminy(y, z) + zz - z;
				check(tmp);
				tmp = getminy(yy, zz) + z - zz;
				check(tmp);
			}
		} else {
			for (int j = 0; j < (int)v[y].size(); j++) {
				int xx = v[y][j].first;
				int zz = v[y][j].second;
				if (xx == x) continue;
				int tmp = getminx(x, z) + zz - z;
				check(tmp);
				tmp = getminx(xx, zz) + z - zz;
				check(tmp);
			}
		}
	}
	puts("Yes");
}

Measured memory_bytes: 29800