//基準の人きめて、そこから座標管理すればいいかな
//あれっぽい、3回ソートするやつ
//ワーシャル
//ループする木みたいな感じ
//N^2は無理
//map?
//M^2通り全部しらべるのも無理
//与えられたデータを調べてM通りのチェックか
//数字でソート。数字ごとに矛盾がないか調べるか
//新しく出現した数字は0位置に固定
//1 2 100
//1 3 200
//1 4 400
//2 3 100 とかはきうる
//map[1]=0
//map[2]=100
//とか。
//初期値、1e10とかにするか
//それ配列でいいかも
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
  ll N,M; cin>>N>>M;
  vector<ll> pos(N+1,1e10);
  vector<vector<ll>> K(M, vector<ll>(3, 0));
  for(int i=0; i<M; i++){
    ll L,R,D; cin>>L>>R>>D;
    if(L>R){
      swap(L,R);
      D=-D;
    }
    K[i][0]=L;
    K[i][1]=R;
    K[i][2]=D;
  }
  sort(K.begin(), K.end(), [](auto& x, auto& y){return x[0] < y[0];});
  for(int i=0; i<M; i++){
    if(pos[K[i][0]]==1e10)
      pos[K[i][0]]=0;
    if(pos[K[i][1]]==1e10)
      pos[K[i][1]]=pos[K[i][0]]+K[i][2];
    if(pos[K[i][1]]-pos[K[i][0]]!=K[i][2]){
      cout<<"No"<<endl;
      return 0;
    }
  }
  cout<<"Yes"<<endl;
  return 0;
}
