# include <iostream>
# include <algorithm>
# include <vector>
# include <string>
# include <set>
# include <map>
# include <cmath>
# include <iomanip>
# include <functional>
# include <utility>
# include <stack>
# include <queue>
# include <list>
# include <tuple>
# include <unordered_map>
# include <numeric>
# include <complex>
# include <bitset>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
typedef pair<LL, LL> P;
constexpr int INF = 2000000000;
constexpr int HINF = INF / 2;
constexpr double DINF = 100000000000000000.0;
constexpr long long LINF = 9223372036854775807;
constexpr long long HLINF = 4500000000000000000;
constexpr long long MMOD = 500000004;
const double PI = acos(-1);
int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
# define ALL(x)      (x).begin(),(x).end()
# define UNIQ(c)     (c).erase(unique(ALL((c))), end((c)))
# define mp          make_pair
# define eb          emplace_back
# define FOR(i,a,b)  for(int i=(a);i<(b);i++)
# define RFOR(i,a,b) for(int i=(a);i>=(b);i--)
# define REP(i,n)    FOR(i,0,n)
# define INIT        std::ios::sync_with_stdio(false);std::cin.tie(0)

template <typename T>
struct WeightedUnionFind {
	LL n;
	T d;
	vector<Int> r, p;
	vector<T> ws;
	WeightedUnionFind() {}
	WeightedUnionFind(LL sz, T d_) :
		n(sz), d(d_), r(n, 1), p(n), ws(n, d) {
		iota(p.begin(), p.end(), 0);
	}
	LL find(LL x) {
		if (x == p[x]) {
			return x;
		}
		else {
			Int t = find(p[x]);
			ws[x] += ws[p[x]];
			return p[x] = t;
		}
	}
	T weight(LL x) {
		find(x);
		return ws[x];
	}
	bool same(LL x, LL y) {
		return find(x) == find(y);
	}
	void unite(LL x, LL y, T w) {
		w += weight(x);
		w -= weight(y);
		x = find(x); y = find(y);
		if (x == y) return;
		if (r[x]<r[y]) swap(x, y), w = -w;
		r[x] += r[y];
		p[y] = x;
		ws[y] = w;
	}
	T diff(LL x, LL y) {
		return weight(y) - weight(x);
	}
};

int main() {
	LL n, m;
	cin >> n >> m;
	WeightedUnionFind<LL> wuf(n + 1, 0);
	for (LL i = 0; i<m; i++) {
		LL l, r, d;
		cin >> l >> r >> d;
		l--; r--;
		if (wuf.same(l, r)) {
			if (wuf.diff(l, r) != d) {
				cout << "No" << endl;
				return 0;
			}
		}
		else {
			wuf.unite(l, r, d);
		}
	}
	cout << "Yes" << endl;
}