//*
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <numeric>
#include <functional>
#define MOD 1000000007
#define MAX 0x3f3f3f3f
#define MAX2 0x3f3f3f3f3f3f3f3fll
#define ERR 1e-10
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#pragma warning(disable:4996)
using namespace std;

typedef long long ll;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;

int n, m, p;
pair<pii, int> a[200000];

vector<pll> edge[300000];

int check[300000];
ll d[300000];

int main()
{
	int i, j, k, l;
	cin>>n>>m>>p;
	for(i=0;i<p;i++)
	{
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z), x--, y--;
		a[i]=mp(mp(x, y), z);
		edge[x].emplace_back(y+n, z);
		edge[y+n].emplace_back(x, z);
	}
	for(i=0;i<n+m;i++)
	{
		if(check[i]) continue;
		check[i]=1;
		vector<int> q;
		q.push_back(i);
		for(j=0;j<q.size();j++)
		{
			int now=q[j];
			for(auto e : edge[now])
			{
				ll u;
				if(now < n) u=d[now]-e.second;
				else u=d[now]+e.second;
				if(check[e.first])
				{
					if(d[e.first] != u) return !printf("No\n");
					continue;
				}
				check[e.first]=1;
				d[e.first]=u;
				q.push_back(e.first);
			}
		}
		ll amin=MAX2, bmin=MAX2;
		for(auto e : q)
		{
			if(e < n) amin=min(amin, d[e]);
			else bmin=min(bmin, -d[e]);
		}
		if(amin+bmin < 0) return !printf("No\n");
	}
	printf("Yes\n");
	return 0;
}
//*/