#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
using ll = long long;
using pil = pair<int, ll>;


const ll INF = (ll)1e15;
const int N = 200000;
int n, m;
vector<pil> Graph[N]; // <p1, p2> のp1は関係を持つ頂点,p2は辺の重み
bool used[N];
ll min1, min2;
ll val[N];  // 二部グラフの頂点の重み. 二次元配列にしないように工夫している


void dfs(int v){
  used[v] = 1;
  for(pil e : Graph[v]){
    int u = e.first; // 相手の頂点
    ll w = e.second - val[v]; // 相手の頂点の重み
    if(used[u]){
      if (w != val[u]){
        min2 = -INF;
        return ;
      }
      continue;
    }
    val[u] = w;
    // 二部グラフのどちらの側かを判定する
    if(u < n){
      min1 = min(min1, w);
    }else{
      min2 = min(min2, w);
    }

    dfs(u);
  }
  return ;
}
int main(){
  int k;
  scanf("%d%d%d", &n, &m, &k);
  while(k--){
    int v, u;
    ll x;
    scanf("%d%d%lld", &v, &u, &x);
    // 0インデックスにする
    v--;
    u--;
    // 1次元配列で表現するための工夫
    u += n;
    Graph[v].push_back(make_pair(u, x));
    Graph[u].push_back(make_pair(v, x));
  }

  for(int i = 0; i < n; ++i){
    if (used[i]) continue;
    min1 = 0;
    min2 = INF;
    val[i] = 0;
    dfs(i);
    if(min1 + min2 < 0){
      printf("No\n");
      return 0;
    }
  }
  printf("Yes\n");

  return 0;
}
