#include <bits/stdc++.h>
using namespace std;
template <typename T>
T gcd(T a, T b) {
  return a ? gcd(b % a, a) : b;
}
template <typename T>
T lcm(T a, T b) {
  return (a / gcd(a, b)) * b;
}
bool is_down(char x) { return ('a' <= x && x <= 'z'); }
bool is_upper(char x) { return ('A' <= x && x <= 'Z'); }
bool is_digit(char x) { return ('0' <= x && x <= '9'); }
const long double pi = 3.141592653589793238462643383279;
const long double log23 = 1.58496250072115618145373894394781;
const long double eps = 1e-8;
const long double zero = 0;
const long long INF = 1e18;
const int COUT = 30;
const int prost = 239;
const long long prost64 = 239;
const int two = 2;
const int thr = 3;
const long long sr = 31;
const long long MOD = 1e9 + 7;
const int BIG = 2 * 1e9 + 1;
const int alf = 26;
const int MAX_N = 2 * 1e5 + 1;
const int MAX_M = 2001;
const int MAX_T = (1 << 20);
const int BLOCK = trunc(sqrt(MAX_N)) + 1;
const int MAX_LOG = 19;
const int km = (1 << 18);
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const int dxo[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
const int dyo[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
const int bit_max = 32;
const int dig = 10;
const string str_alf = "abcdefghijklmnopqrstuvwxyz";
const string str_alf_big = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int digarr[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
const int bt = 31;
struct dsu {
  vector<int> parent, r;
  dsu() { parent = r = {}; }
  dsu(int n) {
    parent.resize(n);
    r.resize(n);
    for (int i = 0; i < n; i++) parent[i] = i, r[i] = 0;
  }
  int find_set(int a) {
    if (parent[a] == a) return a;
    return parent[a] = find_set(parent[a]);
  }
  void merge_set(int a, int b) {
    a = find_set(a);
    b = find_set(b);
    if (a == b) return;
    if (r[a] >= r[b]) swap(a, b);
    parent[a] = b;
    if (r[a] == r[b]) r[b]++;
  }
  bool is_connect(int a, int b) { return find_set(a) == find_set(b); }
};
int n, m, x[MAX_N], pr[MAX_N];
vector<vector<int> > v(MAX_N);
int main() {
  cin.sync_with_stdio(0);
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    x[i] = 0;
    pr[i] = i;
    v[i].push_back(i);
  }
  dsu w = dsu(n);
  for (int i = 0; i < m; i++) {
    int s, f, d;
    cin >> s >> f >> d;
    s--, f--;
    if (w.is_connect(s, f)) {
      if (x[f] - x[s] != d) {
        cout << "No";
        return 0;
      }
    } else {
      w.merge_set(s, f);
      if (v[s].size() > v[f].size()) {
        swap(s, f);
        d = -d;
      }
      int dl = (x[f] - d) - x[s];
      int oo = pr[s];
      while (!v[oo].empty()) {
        pr[v[oo].back()] = pr[f];
        x[v[oo].back()] += dl;
        v[pr[f]].push_back(v[oo].back());
        v[oo].pop_back();
      }
    }
  }
  cout << "Yes";
  return 0;
}
