#include <cstdio>
#include <numeric>
#include <iostream>
#include <vector>
#include <set>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <queue>
#include <sstream>
#include <deque>
#include <cassert>

using namespace std;

#define mp make_pair
#define pb push_back
#define rep(i,n) for(int i = 0; i < (n); i++)
#define re return
#define fi first
#define se second
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
#define sqrt(x) sqrt(abs(x))
#define y0 y3487465
#define y1 y8687969
#define fill(x,y) memset(x,y,sizeof(x))
#define prev PREV
#define next NEXT
                         
typedef vector<int> vi;
typedef long long ll;
typedef long double ld;
typedef double D;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<string> vs;
typedef vector<vi> vvi;

template<class T> T abs(T x) { re x > 0 ? x : -x; }
template<class T> inline T sqr (T x) { re x * x; }

#define filename ""

const int N = 100000;

int n;
int m;
vii v[2 * N];
ll val[2 * N];
int was[2 * N];
vi p, q;

int go (int x, ll y) {
	if (was[x]) {
		if (val[x] != y) re 0;
		re 1;
	}
	if (x < n) p.pb (x); else q.pb (x - n);
	was[x] = 1;
	val[x] = y;
	for (int i = 0; i < sz (v[x]); i++)
		if (!go (v[x][i].fi, v[x][i].se - y))
			re 0;
	re 1;
}

int main () {
	int q;
	scanf ("%d%d%d", &n, &m, &q);
	for (int i = 0; i < q; i++) {
		int a, b, c;
		scanf ("%d%d%d", &a, &b, &c); a--; b--;
		v[a].pb (mp (b + n, c));
		v[b + n].pb (mp (a, c));
	}
	for (int i = 0; i < n + m; i++)
		if (!was[i]) {
			p.clear ();
			::q.clear ();
			if (!go (i, 0)) {
				printf ("No\n");
				re 0;
			}
			ll mp = 1e18, mq = 1e18;
			for (int j = 0; j < sz (p); j++)
				mp = min (mp, val[p[j]]);
			for (int j = 0; j < sz (::q); j++)
				mq = min (mq, val[::q[j] + n]);
			if (mp + mq < 0) {
				printf ("No\n");
				re 0;
			}
		}
	printf ("Yes\n");
	return 0;
}