// 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.022317635232134x):
#include <cstdio>

#include <cstring>

#include <iostream>

using namespace std;

#define maxn 200000 + 10

int father[maxn];

int val[maxn];

int Find(int x)

{

    if (x == father[x])

        return x;

    int temp = father[x];

    father[x] = Find(father[x]);

    val[x] += val[temp];

    return father[x];

}

int n, m;

int main()

{

    while (~scanf("%d %d", &n, &m))

    {

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

        {

            father[i] = i;

            val[i] = 0;

        }

        int ans = 0;

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

        {

            int u, v, w;

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

//            u -= 1;

            int ru = Find(u), rv = Find(v);

            if (ru == rv)

            {

                if (val[u] + w != val[v])

                {

                    cout << "No" << endl;

                    return 0;

                }

            }

            else

            {

                father[rv] = ru;

                val[rv] = val[u] - val[v] + w;

            }

        }

        cout << "Yes" << endl;

    }

    return 0;

}