#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long expo(long long base, long long pow) {
  long long ans = 1;
  while (pow != 0) {
    if (pow & 1 == 1) {
      ans = ans * base;
      ans = ans % mod;
    }
    base *= base;
    base %= mod;
    pow /= 2;
  }
  return ans;
}
long long inv(long long x) { return expo(x, mod - 2); }
long long mult_mod(long long a, long long b) {
  a = a % mod;
  b = b % mod;
  long long c = (a * b) % mod;
  return c;
}
long long add_mod(long long a, long long b) {
  a = (a + 100 * 1LL * mod) % mod;
  b = (b + 100 * 1LL * mod) % mod;
  long long c = (a + b) % mod;
  return c;
}
long long fac[(int)(1e3 + 5)], inv_fac[(int)(1e3 + 5)];
void precomp_factorial(int M) {
  fac[0] = 1;
  for (int i = 1; i <= M; i++) fac[i] = mult_mod(i, fac[i - 1]);
  inv_fac[M] = inv(fac[M]);
  for (int i = M - 1; i >= 0; i--) inv_fac[i] = mult_mod(i + 1, inv_fac[i + 1]);
}
long long nCk(long long n, long long k) {
  long long ans = fac[n];
  ans = mult_mod(ans, inv_fac[n - k]);
  ans = mult_mod(ans, inv_fac[k]);
  return ans;
}
int lo[(int)(1e3 + 6)];
void sieve(int M) {
  for (int i = 2; i < M; i++) {
    if (lo[i]) continue;
    for (int j = i; j < M; j += i) lo[j] = i;
  }
}
int max_expo_prime_n_fac(long long N, int prime) {
  int ress = 0;
  while (N) {
    ress += (N / prime);
    N /= prime;
  }
  return ress;
}
string get_prefix(string x, int MAX) {
  return x.substr(0, min((int)x.size(), MAX));
}
string get_suffix(string x, int MAX) {
  int dn = 1;
  for (int i = x.size() - 1; i >= 0; i--) {
    if (dn == MAX) return x.substr(i);
    dn++;
  }
  return x;
}
string convert_to_binary(int x, int len) {
  string ans = "";
  while (x) {
    if (x & 1) {
      ans = '1' + ans;
    } else {
      ans = '0' + ans;
    }
    x /= 2;
  }
  int k = ans.size();
  while (k < len) {
    ans = '0' + ans;
    k++;
  }
  return ans;
}
unsigned long long llrand() {
  unsigned long long r = 0;
  for (int i = 0; i < 5; ++i) {
    r = (r << 15) | (rand() & 0x7FFF);
  }
  return r & 0xFFFFFFFFFFFFFFFFULL;
}
int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int arr[123456][10], val[123456];
int main() {
  int n, m;
  cin >> n >> m;
  vector<pair<int, int> > vec;
  map<pair<int, int>, int> mp;
  for (int i = 0; i <= 1e5; i++) val[i] = -1;
  int cond = 1;
  for (int i = 0; i < m; i++) {
    int l, r, d;
    cin >> l >> r >> d;
    if (l > r) {
      d = -1 * d;
      swap(l, r);
    }
    vec.push_back({l, r});
    mp[{l, r}] = d;
  }
  sort(vec.begin(), vec.end());
  val[1] = 0;
  int min1 = 1e9, max1 = INT_MIN;
  for (int i = 0; i < m; i++) {
    int n1 = vec[i].first;
    int n2 = vec[i].second;
    if (val[n2] == -1) {
      val[n2] = val[n1] + mp[{n1, n2}];
      max1 = max(max1, val[n2]);
      min1 = min(min1, val[n2]);
    } else {
      if (val[n2] != val[n1] + mp[{n1, n2}]) {
        cond = 0;
        break;
      }
    }
  }
  long long r = 1LL * max1 - 1LL * min1;
  if (r > 1e9) cond = 0;
  if (cond)
    cout << "Yes";
  else
    cout << "No";
}
