// 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: 4.0149284492872575x):
#include<iostream>

using namespace std;

int per[100010];

long long dis[100010];

int flag;

long long maxn;

inline int find(int x)

{

	if(x == per[x])

		return x;

	else

	{

		int x1 = per[x];

		int x2 = find(x1);

		dis[x] = dis[x] + dis[x1];

		return per[x] = x2;

	}

}

inline void merge(int x,int y,int d1)

{

	int fx = find(x);

	int fy = find(y);

	if(fx != fy)

	{

		if(dis[x] + d1 - dis[y] > 0)

		{

			dis[fy] = dis[x] + d1 - dis[y];

			per[fy] = fx;

		}

		else

		{

			dis[fx] = dis[y] - d1 - dis[x];

			per[fx] = fy;

		}

		if(dis[fy] > maxn)

			maxn = dis[fy];

		if(dis[fx] > maxn)

			maxn = dis[fx];

	}

	else

	{

		if(dis[y] - dis[x] != d1)

			flag = 0;

	}

}

int main()

{

	int n,m;

	while(cin >>n >> m)

	{

		int x1,x2,d;

		flag = 1;

		maxn = 0;

		for(int i = 0;i <= n;++i)

		{

			per[i] = i;

			dis[i] = 0;

		}

		for(int i = 1;i <= m;++i)

		{

			cin >> x1 >> x2 >> d;

			merge(x1,x2,d);

		}

		if(maxn > 1e+9)

			flag = 0;

		if(flag)

			cout << "Yes" << endl;

		else

			cout << "No" << endl;

	}

	return 0;

}