// Slower C++ solution:
#include <iostream>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <bitset>

#include <algorithm>

#include <cstdio>

#include <time.h>

#include <queue>

#include <set>

#include <map>

#include <stack>

#include <math.h>

//#include <bits/stdc++.h>

#define ll long long

#define int64 long long

#define mem(x,y) memset(x,y,sizeof(x))

#define ull unsigned long long

#define pb push_back

#define INF 0x7f7f7f7f

#define lson l, mid, rt<<1

#define rson mid+1, r, rt<<1|1

#define pi 3.141592653589793238462

#define stdio std::ios::sync_with_stdio(false)

#define zero(x) (((x)>0?(x):-(x))<eps)



using namespace std;



inline bool nextDouble(double &num) {

    char in;

    double Dec = 0.1;

    bool IsN = false, IsD = false;

    in = getchar();

    if (in == EOF) return false;

    while (in != '-' && in != '.' && (in < '0' || in > '9'))

        in = getchar();

    if (in == '-') {

        IsN = true;

        num = 0;

    } else if (in == '.') {

        IsD = true;

        num = 0;

    } else num = in - '0';

    if (!IsD) {

        while (in = getchar(), in >= '0' && in <= '9') {

            num *= 10;

            num += in - '0';

        }

    }

    if (in != '.') {

        if (IsN) num = -num;

        return true;

    } else {

        while (in = getchar(), in >= '0' && in <= '9') {

            num += Dec * (in - '0');

            Dec *= 0.1;

        }

    }

    if (IsN) num = -num;

    return true;

}

inline bool nextLongDouble(long double &num) {

    char in;

    long double Dec = 0.1;

    bool IsN = false, IsD = false;

    in = getchar();

    if (in == EOF) return false;

    while (in != '-' && in != '.' && (in < '0' || in > '9'))

        in = getchar();

    if (in == '-') {

        IsN = true;

        num = 0;

    } else if (in == '.') {

        IsD = true;

        num = 0;

    } else num = in - '0';

    if (!IsD) {

        while (in = getchar(), in >= '0' && in <= '9') {

            num *= 10;

            num += in - '0';

        }

    }

    if (in != '.') {

        if (IsN) num = -num;

        return true;

    } else {

        while (in = getchar(), in >= '0' && in <= '9') {

            num += Dec * (in - '0');

            Dec *= 0.1;

        }

    }

    if (IsN) num = -num;

    return true;

}

inline bool nextInt(int &num) {

    char in;

    bool IsN = false;

    in = getchar();

    if (in == EOF) return false;

    while (in != '-' && (in < '0' || in > '9')) in = getchar();

    if (in == '-') {

        IsN = true;

        num = 0;

    } else num = in - '0';

    while (in = getchar(), in >= '0' && in <= '9') {

        num *= 10, num += in - '0';

    }

    if (IsN) num = -num;

    return true;

}

inline bool nextLong(ll &num) {

    char in;

    bool IsN = false;

    in = getchar();

    if (in == EOF) return false;

    while (in != '-' && (in < '0' || in > '9')) in = getchar();

    if (in == '-') {

        IsN = true;

        num = 0;

    } else num = in - '0';

    while (in = getchar(), in >= '0' && in <= '9') {

        num *= 10, num += in - '0';

    }

    if (IsN) num = -num;

    return true;

}

inline bool blank(char ch) {

    return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';

}

inline void read(char *s) {

    char ch = getchar();

    for (; blank(ch); ch = getchar());

    for (; !blank(ch); ch = getchar()) * s++ = ch;

    *s = 0;

}

const int maxn = 1e5 + 5;

const int maxm = 2e6 + 5;

const int mod =  1e9;

const int seed = 10007;

const double eps = 1e-6;

int n, m;

typedef pair<int, int> dist;



vector<dist> g[maxn];



int dis[maxn];

bool vis[maxn];

bool dfs(int x) {

    vis[x] = false;

    for (int i = 0; i < g[x].size(); i++) {

        int v = g[x][i].first;

        int w = g[x][i].second;

        if (dis[v] == -1) {

            dis[v] = dis[x] + w;

            if (!dfs(v)) return false;

        } else {

            if (dis[v] == dis[x] + w) {

                continue;

            } else {

                return false;

            }

        }

    }

    return true;

}



int main() {

    scanf("%d%d", &n, &m);

    int u, v, w;

    for (int i = 0; i < m; i++) {

        scanf("%d%d%d", &u, &v, &w);

        g[u].pb(dist(v, w));

    }

    mem(vis, true);

    bool flag = true;

    for (int i = 1; i <= n; i++) {

        if (vis[i]) {

            mem(dis, -1);

            flag = dfs(i);

            if (!flag) break;

        }

    }

    if (flag) printf("Yes\n");

    else printf("No\n");

    return 0;

}

/*

for(x:i) if(ans[x][j]=0) ans[i][j]=1

for(x:i) if(ans[x][j]=1)

*/


// Faster C++ solution for the same problem (measured speedup: 1.1293983884258143x):
#include <bits/stdc++.h>

using namespace std;

#define int long long

#define vi vector<int>

#define fileopen(filename) if (fopen(filename".INP", "r")) {freopen(filename".INP", "r", stdin);freopen(filename".OUT", "w", stdout);}

#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

#define rep(i,n) for (int i=1;i<=n;++i)

#define eb emplace_back

#define pb push_back

#define memset(a,i) memset(a,i,sizeof(a))

#define upper(v,a) upper_bound(v.begin(), v.end(), a)

#define lower(v,a) lower_bound(v.begin(), v.end(), a)

#define ii pair<int,int>

#define fi first

#define se second

#define endl '\n'

#define gcd __gcd

const int maxn=1e5+1;

const int INF=1e9+1;



bool used[maxn];

vector<ii> adj[maxn];



void dfs(int dis[],int node, int dist)

{

	used[node]=1;

	for (ii i : adj[node])

		if (!used[i.fi])

		{

			dis[i.fi]=dist+i.se;

			dfs(dis,i.fi,dist+i.se);

		}	

		else if (dist+i.se!=dis[i.fi])

		{

			//cout<<node<<' '<<i.fi;

			cout<<"No";exit(0);

			

		}

}



signed main()

{

	fastio;

	int n,m;cin>>n>>m;

	while (m--)

	{

		int a,b,c;cin>>a>>b>>c;

		adj[a].eb(ii(b,c));

		adj[b].eb(ii(a,-c));

	}

	rep(i,n)if (!used[i])

	{

		int a[n+1];

		a[i]=0;

		dfs(a,i,0);

	}

	cout<<"Yes";

}