#include <bits/stdc++.h>
using namespace std;
/*{{{*/  //template
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rrep(i,n) for(int i=(n)-1;i>=0;i--)
constexpr int INF = numeric_limits<int>::max()/2;
constexpr long long LINF = numeric_limits<long long>::max()/3;
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr<<#x<<":"<<x<<endl
#define debug2(x,y) cerr<<#x<<","<<#y":"<<x<<","<<y<<endl
//struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double{ double d; explicit Double(double x) : d(x){} };
ostream& operator<<(ostream& os,const Double x){ os << fixed << setprecision(20) << x.d; return os; }
template<typename T> ostream& operator<<(ostream& os,const vector<T>& vec){ os << "["; for(const auto& v : vec){ os << v << ","; } os << "]"; return os; }
template<typename T,typename U> ostream& operator<<(ostream& os, const map<T,U>& mp){ os << "{"; for(auto& p : mp){ os << p << ","; } os << "}"; return os; }
template<typename T,typename U> ostream& operator<<(ostream& os,const pair<T,U>& p){ os << "(" << p.first << ","<< p.second <<")"; return os; }
template<typename T> ostream& operator<<(ostream& os,const set<T>& st){ os<<"{"; for(T v:st) os<<v<<","; os <<"}"; return os; }
template<typename T,typename U> inline void chmax(T &x,U y){ if(y>x) x = y; }
template<typename T,typename U> inline void chmin(T &x,U y){ if(y<x) x = y; }
using ll = long long;
using ull = unsigned long long;
using pii = std::pair<int,int>;
using vi = std::vector<int>;
typedef vector<vi> vvi;
ll gcd(ll a,ll b){ if(b==0) return a; else return gcd(b,a%b); }
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
//constexpr double eps = 1e-14;
constexpr double eps = 1e-10;
constexpr ll mod = 1e9+7;
const int dx[]={1,0,-1,0} ,dy[] = {0,1,0,-1};
/*}}}*/

using P = pair<ll,ll>;

int n,m;
vector<vector<P>> g;
vector<bool> visit;
vector<P> poly; // ax+b --> (a,b)
struct E{
    ll a,b,s;
    E(ll a,ll b,ll s) : a(a), b(b), s(s){}
};
vector<E> es;

void dfs(int u){
    visit[u] = true;
    for(auto& p : g[u]){
        int v = p.first;
        ll s = p.second;
        if(visit[v]) continue;

        poly[v].first = -poly[u].first;
        poly[v].second = s - poly[u].second;
        dfs(v);
    }
}

int main(){
    cin >> n >> m;
    g.resize(n);
    rep(i,m){
        int u,v,s; cin >> u >> v >> s;
        u--; v--;
        g[u].emplace_back(v,s);
        g[v].emplace_back(u,s);
        es.emplace_back(u,v,s);
    }

    visit.assign(n,false);
    poly.resize(n);
    poly[0]=make_pair(1,0);
    dfs(0);

    /* rep(i,n){ */
    /*     cout << i << " " << poly[i] << endl; */
    /* } */

    ll l,r;
    l = 1;
    r = 1e9+7;
    rep(u,n){
        for(auto& p : g[u]){
            int v = p.first;
            ll s = p.second;

            if(poly[u].first!=poly[v].first){
                assert(poly[u].first+poly[v].first==0);
                if(poly[u].second+poly[v].second==s){
                    continue;
                }else{
                    cout << 0 << endl;
                    return 0;
                }
            }else{
                // ax+bと別の方程式cx+dをuに割り当て可能(a!=c)
                ll a,b,c,d;
                tie(a,b)=poly[u];
                c = -poly[v].first;
                d = s - poly[v].second;
                // ax+b=cx+d --> x = (d-b)/(a-c)
                if((d-b)%(a-c)!=0){ // 整数解が存在しない
                    cout << 0 << endl;
                    return 0;
                }

                ll x = (d-b)/(a-c);
                if(x <= 0){ // 頂点0に正の値を割り当てられない
                    cout << 0 << endl;
                    return 0;
                }

                vector<ll> val(n);
                val[0] = x;
                rep(i,n) if(i>0){
                    val[i] = x * poly[i].first + poly[i].second;
                    if(val[i]<=0){
                        cout << 0 << endl;
                        return 0;
                    }
                }

                rep(i,m){
                    if(val[es[i].a]+val[es[i].b]!=es[i].s){
                        cout << 0 << endl;
                        return 0;
                    }
                }
                cout << 1 << endl;
                return 0;
            }
        }

        if(poly[u].first == 1){
            l = max(l,1-poly[u].second);
        }else{
            r = min(r,poly[u].second-1);
        }
    }

    cout << max(r-l+1,0ll) << endl;
}


Measured memory_bytes: 16432