#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class A, size_t N, class T>
void Fill(A (&a)[N], const T &v) {
  fill((T *)a, (T *)(a + N), v);
}
const long long int INF = 1e9 + 7;
vector<pair<int, int> > dist[100005];
long long int x[100005] = {};
bool ans = true;
void dfs(int l) {
  if (!ans) return;
  for (auto p : dist[l]) {
    int r = p.first;
    int d = p.second;
    if (x[r] == 0) {
      x[r] = x[l] + d;
    } else if (x[r] != x[l] + d) {
      ans = false;
      return;
    }
    dfs(r);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  int N, M;
  int cnt[100005] = {};
  cin >> N >> M;
  for (int i = 0; i < (M); i++) {
    int L, R, D;
    cin >> L >> R >> D;
    L--;
    R--;
    dist[L].emplace_back(R, D);
    cnt[R]++;
  }
  for (int n = 0; n < (N); n++)
    if (cnt[n] == 0) {
      dfs(n);
    }
  for (int i = 0; i < (N); i++)
    if (cnt[i] > 0 && x[i] == 0) ans = false;
  cout << (ans ? "Yes" : "No") << endl;
  return 0;
}
