// #include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_int.hpp>
//
// #define rep(i,a,b) for(ll i=a;i<b;i++)
// #define rrep(i,b,a) for(int i=b;i>=a;i--)
// #define fori(a) for(auto i : a )
// #define all(a) begin(a), end(a)
// #define set(a,b) memset(a,b,sizeof(a))
// #define sz(a) a.size()
// double pi=acos(-1);
// #define ll long long
// #define ull unsigned long long
// #define pb push_back
// #define PF push_front //deque
// // #define mp make_pair
// #define pq priority_queue
// const ll mod=1000000007;
// #define f first
// #define s second
// #define pii pair< ll, ll >
// #define vi vector<int>
// #define vpii vector<pii>
// #define debug(v) for(auto i:v) cout<<i<<" ";
// #define tc int t; cin >> t; while(t--)
//
// using namespace boost::multiprecision;
// using namespace std;
// void optimizeIO(){
//     ios_base::sync_with_stdio(false);
//     cin.tie(NULL);
//     cout.tie(NULL);
// }
//
//
// const int N=1000005;
// ll fact[N],invfact[N];
// ll power(ll x,ll y){
//   if(y<=0) return 1LL;
//   ll z=power(x,y/2);
//   if(y%2) return (((z*z)%mod)*x)%mod;
//   return (z*z)%mod;
// }
//
// void pre(){
//   fact[0]=invfact[0]=invfact[1]=fact[1]=1;
//   rep(i,2,N) fact[i]=(i*fact[i-1])%mod;
//   rep(i,2,N) invfact[i]=(invfact[i-1]*power(i,mod-2))%mod;
// }
// ll nCr(ll n,ll k){ return (((fact[n]*invfact[n-k])%mod)*invfact[k])%mod; }
//
//
//
// const int N1=1e6+1;
// vector<int> isprime(N1,1),prime;
// void seive(){
//   rep(i,2,sqrt(N1)+1){
//       if(isprime[i]){
//         for(int j=i*i;j<N1;j+=i) isprime[j]=0;
//         prime.pb(i);
//       }
//   }
//   rep(i,sqrt(N1)+1,N1) if(isprime[i]) prime.pb(i);
// }
//
//
//
// struct dsu {
//     vector<int> par, rank;
//     dsu(int n): par(n+1), rank(n+1) {
//         for (int i = 0; i <= n; i++) {
//             par[i] = i;
//             rank[i]= 1;
//         }
//     }
//     int root(int a) {
//         if (a == par[a]) return a;
//         return par[a] = root(par[a]);
//     }
//     void merge(int a, int b) {
//         a = root(a);
//         b = root(b);
//         if (a == b) return;
//         if (rank[a] > rank[b]) swap(a, b);
//         par[b] = a;
//     }
//     set<int> parent(int n){
//         set<int> s;
//         for(int i=1;i<=n;i++){
//             s.insert(root(i));
//         }
//         return s;
//     }
// };
// int dx[]={1,-1,0,0};
// int dy[]={0,0,1,-1};
// bool safe(int i,int j, int h,int w){
//   return (i>=0 && i<h && j>=0 && j<w);
// }
// void dfs(int v,vector<int> &vis,vector<vector<pii>> &graph,vector<ll> &ans,int &flag){
//   if(vis[v]) return;
//   vis[v]=1;
//   for(auto j:graph[v]){
//     if(ans[j.f]!=-1 && ans[j.f]+j.s!= ans[v] ) flag=1;
//     if(!vis[j.f]) {dfs(j.f,vis,graph,ans,flag); ans[j.f]= ans[v]-j.s;}
//   }
// }
// void solve(){
//   int n,m,l,r,di;
//   cin>>n>>m;
//   vector<pair<pair<int,int>,int>> v1(m);
//   dsu d(n);
//   rep(i,0,m){
//     cin>>v1[i].f.f>>v1[i].f.s>>v1[i].s;
//     v1[i].f.f--,v1[i].f.s--;
//     d.merge(v1[i].f.f,v1[i].f.s);
//   }
//   sort(all(v1),[](pair<pair<int,int>,int> x, pair<pair<int,int>,int> y){ return x.s<y.s;});
//   map<int,set<pair<pair<int,int>,int> > > m1;
//   rep(i,0,m){
//     m1[d.root(v1[i].f.f)].insert(v1[i]);
//   }
//   vector<ll> ans(n,-1);
//   for(auto i:m1){
//     vector<pair<pair<int,int>,int>> v2(all(i.s));
//     vector<vector<pii>> graph(n);
//     rep(j,0,v2.size()) {
//       graph[v2[j].f.s].push_back({v2[j].f.f,v2[j].s});
//       graph[v2[j].f.f].push_back({v2[j].f.s,-1*v2[j].s});
//     }
//     vector<int> vis(n,0);
//     int flag=0;
//     // auto dfs=[];
//     ans[v2[0].f.s]=1e9;
//     dfs(v2[0].f.s,vis,graph,ans,flag);
//     if(flag==1){cout<<"No\n"; return;}
//   }
//   cout<<"Yes\n";
// }
//
// int main(){
//     optimizeIO();
//     solve();
// }


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>

int dis[100010], par[100010];
int flag = 1;

int find(int x){
    if(par[x] == x){
        return x;
    }else{
        int r = find(par[x]);
        dis[x] = dis[par[x]] + dis[x];
        par[x] = r;
        return par[x];
    }
}

void unite(int x, int y, int z){
    int fx = find(x);
    int fy = find(y);

    if(fx == fy){
        if(abs(dis[x] - dis[y]) != z){
            flag = 0;
        }
    }else{
        par[fy] = fx;
        dis[fy] = dis[x] + z - dis[y];
    }
}

int main(void){

    int N, M;

    scanf("%d%d", &N, &M);

    for(int i = 0; i < N; i++){
        par[i] = i;
    }

    for(int i = 0; i < M; i++){
        int l, m, d;
        scanf("%d%d%d", &l, &m, &d);
        unite(l, m, d);
    }

    if(flag == 1){
        printf("Yes\n");
    }else{
        printf("No\n");
    }

    return 0;
}


Measured memory_bytes: 2412