#include <bits/stdc++.h>
using namespace std;
  
// Macro Tools /////////////////////////////////////////////////////////////////
#define GET_MACRO_09(A0, A1, A2, A3, A4, A5, A6, A7, A8, NAME, ...) NAME
  
#define EXPAND_01(MACRO, A0, ...) \
    MACRO(A0, ##__VA_ARGS__) 
#define EXPAND_02(MACRO, A0, A1, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) 
#define EXPAND_03(MACRO, A0, A1, A2, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__) 
#define EXPAND_04(MACRO, A0, A1, A2, A3, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__)  \
    MACRO(A3, ##__VA_ARGS__) 
#define EXPAND_05(MACRO, A0, A1, A2, A3, A4, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__)  \
    MACRO(A3, ##__VA_ARGS__) MACRO(A4, ##__VA_ARGS__) 
#define EXPAND_06(MACRO, A0, A1, A2, A3, A4, A5, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__)  \
    MACRO(A3, ##__VA_ARGS__) MACRO(A4, ##__VA_ARGS__) MACRO(A5, ##__VA_ARGS__) 
#define EXPAND_07(MACRO, A0, A1, A2, A3, A4, A5, A6, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__)  \
    MACRO(A3, ##__VA_ARGS__) MACRO(A4, ##__VA_ARGS__) MACRO(A5, ##__VA_ARGS__)  \
    MACRO(A6, ##__VA_ARGS__) 
#define EXPAND_08(MACRO, A0, A1, A2, A3, A4, A5, A6, A7, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__)  \
    MACRO(A3, ##__VA_ARGS__) MACRO(A4, ##__VA_ARGS__) MACRO(A5, ##__VA_ARGS__)  \
    MACRO(A6, ##__VA_ARGS__) MACRO(A7, ##__VA_ARGS__) 
#define EXPAND_09(MACRO, A0, A1, A2, A3, A4, A5, A6, A7, A8, ...) \
    MACRO(A0, ##__VA_ARGS__) MACRO(A1, ##__VA_ARGS__) MACRO(A2, ##__VA_ARGS__)  \
    MACRO(A3, ##__VA_ARGS__) MACRO(A4, ##__VA_ARGS__) MACRO(A5, ##__VA_ARGS__)  \
    MACRO(A6, ##__VA_ARGS__) MACRO(A7, ##__VA_ARGS__) MACRO(A8, ##__VA_ARGS__) 
  
#define GET_EXPAND(...) GET_MACRO_09(__VA_ARGS__, EXPAND_09, EXPAND_08, \
    EXPAND_07, EXPAND_06, EXPAND_05, EXPAND_04, EXPAND_03, EXPAND_02, EXPAND_01)
#define EXPAND_ARG_0(MACRO, ...) GET_EXPAND(__VA_ARGS__)(MACRO, __VA_ARGS__)
#define EXPAND_ARG_1(MACRO, A0, ...) GET_EXPAND(__VA_ARGS__)(MACRO, __VA_ARGS__, A0)
  
#define EXPAND(MACRO, ...) EXPAND_ARG_0(MACRO, __VA_ARGS__)
  
#define Q(x) #x
#define QUOTE(x) Q(x)
  
// Input ///////////////////////////////////////////////////////////////////////
#define SCANF_INT(a) scanf("%d", &(a));
#define ID(...) int __VA_ARGS__;
#define IR(...) {EXPAND(SCANF_INT, __VA_ARGS__)}
#define I(...) ID(__VA_ARGS__) IR(__VA_ARGS__)
  
// #define DEFINE_INT_ARRAY(a, n) int a[n];
// #define INT_ITH_ARRAY(a, i) a[i]
// #define IAD(N, ...) EXPAND_ARG_1(DEFINE_INT_ARRAY, N, __VA_ARGS__)
// #define IAR(N, ...) REP(array_reader_i, N){ 
  
#define SCANF_LL(a) scanf("%lld", &(a));
#define LD(...) ll __VA_ARGS__;
#define LR(...) {EXPAND(SCANF_LL, __VA_ARGS__)}
#define L(...) LD(__VA_ARGS__) LR(__VA_ARGS__)
  
#define SCANF_LD(a) scanf("%Lf", &(a));
#define DD(...) lD __VA_ARGS__;
#define DR(...) {EXPAND(SCANF_LD, __VA_ARGS__)}
#define D(...) DD(__VA_ARGS__) DR(__VA_ARGS__)
  
#define DEFINE_STR(a, n) char a[n];
#define SCANF_STR(a) scanf("%s", a);
#define SD(N, ...) EXPAND_ARG_1(DEFINE_STR, N, __VA_ARGS__)
#define SR(...) EXPAND(SCANF_STR, __VA_ARGS__)
#define S(N, ...) SD(N, __VA_ARGS__) SR(__VA_ARGS__)
  
// Output //////////////////////////////////////////////////////////////////////
#define LN printf("\n")
#define FL fflush(stdout)
  
#define IP(a, ...) printf("%d", a); 
  
// Types ///////////////////////////////////////////////////////////////////////
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
typedef set<int> si;
typedef set<ll> sll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef list<int> li;
typedef list<ll> lll;
typedef map<int, int> mii;
typedef map<int, ll> mil;
typedef map<ll, int> mli;
typedef map<ll, ll> mll;
  
// Loop & Iteration ////////////////////////////////////////////////////////////
#define FORT(t, i, a, b) \
    for(t i = (a), loop_end_##i=(b); i < (loop_end_##i); i++)
#define FORL(i, a, b) FORT(ll, i, a, b)
#define FOR(i, a, b) FORT(int, i, a, b)
#define REPT(t, i, n) FORT(t, i, 0, n)
#define REPL(i, n) FORL(i, 0, n)
#define REP(i, n) FOR(i, 0, n)
#define EACH(i,c) for(auto i=(c).begin(); i!=(c).end(); ++i)
  
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define ALL(a) (a).begin(), (a).end()
#define SORT(a) sort(ALL(a))
#define SORTA(a, n) sort(a, a+n)
  
#define PB push_back
#define MP make_pair
#define itr iterator
  
// Range ///////////////////////////////////////////////////////////////////////
#define IN(x, a, b) (a<=x && x<b)
#define INC(x, a, b) (a<=x && x<=b)
int dx[8] = { 1, 0, 0,-1, 1, 1,-1,-1};
int dy[8] = { 0,-1, 1, 0,-1, 1,-1, 1};
  
#define LAR(a, b) ((a)=max((a), (b)))
#define SML(a, b) ((a)=min((a), (b)))
  
// Debug ///////////////////////////////////////////////////////////////////////
#define println(...) {printf(__VA_ARGS__); printf("\n");}
#ifdef LOCAL
#define debug(...) printf(__VA_ARGS__)
#define debugln(...) println(__VA_ARGS__)
#else
#define debug(...) {}
#define debugln(...) {}
#endif
  
// Numbers /////////////////////////////////////////////////////////////////////
ll gcd(ll a, ll b){
    if(b==0) return a;
    else return gcd(b, a%b);
}
  
#define PRIME_MAX 1000000
bool isprime[PRIME_MAX+5];
void init_prime(){
    fill(isprime, isprime+PRIME_MAX+5, true);
    isprime[0]=isprime[1]=false;
    REP(i, PRIME_MAX+5){
        if(isprime[i]){
            for(int j=i*2; j<PRIME_MAX; j+=i){
                isprime[j]=false;
            }
        }
    }
}
  
vll factors(ll n){
    vll v;
    REPL(i, PRIME_MAX){
        if(!isprime[i]) continue;
        while(n%i==0){
            v.PB(i);
            n/=i;
        }
    }
    if(n>1){
        v.PB(n);
    }
    return v;
}
  
// BIT /////////////////////////////////////////////////////////////////////////
template<
    typename T = int
>
class bit{
public:
    T *bit_arr;
    int size;
  
    bit(int n){
        size = n;
        bit_arr = new T[n];
        fill(bit_arr, bit_arr+n, 0);
    }
  
    ~bit(){
        delete bit_arr;
    }
  
    T sum(int a){
        T ret = 0;
        while(a){
            ret+=bit_arr[a];
            a-=a&-a;
        }
        return ret;
    }
  
    T sum(int a, int b){
        return sum(b)-sum(a);
    }
  
    T get(int a){
        return sum(a, a+1);
    }
  
    void add(int a, T x){
        a++;
        while(a<size){
            bit_arr[a]+=x;
            a+=a&-a;
        }
    }
  
    void set(int a, T x){
        add(a, x-get(a));
    }
};
typedef bit<ll> bll;
  
// RMQ (with index information!) ///////////////////////////////////////////////
template<
    typename T = int,
    class Compare=less<T>
>
class rmq{
public:
    int size;
    Compare comp;
    pair<T, int> *dat;
    T init;
    
    pair<T, int> mymin(pair<T, int> x, pair<T, int> y){
        if(x.first == y.first) return MP(x.first, min(x.second, y.second));
        else if(min(x.first, y.first, comp)==x.first) return x;
        else return y;
    }
    
    rmq(int n, T init_=INT_MAX){
        init=init_;
        size = 2;
        while(size<n) size*=2;
        dat = new pair<T, int>[2*size-1];
        REP(i, n) dat[size-1+i]=MP(init, i);
        for(int i=size-2; i>=0; i--) dat[i]=mymin(dat[i*2+1], dat[i*2+2]);
    }
  
    ~rmq(){
        delete dat;
    }
  
    void set(int k, T a){
        k+=size-1;
        dat[k]=MP(a, k-(size-1));
        while(k>0){
            k=(k-1)/2;
            dat[k]=mymin(dat[k*2+1], dat[k*2+2]);
        }
    }
  
    pair<T, int> get(int a, int b, int k, int l, int r){
        if(r<=a || b<=l) return MP(init, -1);
        if(a<=l && r<=b) return dat[k];
        else{
            pair<T, int> vl = get(a, b, k*2+1, l, (l+r)/2);
            pair<T, int> vr = get(a, b, k*2+2, (l+r)/2, r);
            return mymin(vl, vr);
        }
    }
  
    pair<T, int> getp(int a, int b){
        return get(a, b, 0, 0, size);
    }
    
    T get(int a, int b){
        return getp(a, b).first;
    }
    
    int geti(int a, int b){
        return getp(a, b).second;
    }
};
  
// Others //////////////////////////////////////////////////////////////////////
#define MOD 1000000007
#define YES() printf("YES\n")
#define NO() printf("NO\n")
  
////////////////////////////////////////////////////////////////////////////////

#define N 112345
int n, m;
vector<pil> g[N];
ll x[N];
int sg[N];
ll detn=-1;

bool dfs(int a){
	for(pli v : g[a]){
		int b = v.first;
		ll s = v.second;
		if(sg[b]){
			if(~detn){
				if(sg[a]*detn+x[a]+sg[b]*detn+x[b]!=s){
					return false;
				}
			}else{
				if(sg[a]+sg[b]){
					ll y=s-x[a]-x[b];
					if(y%2) return false;
					y/=sg[a]*2;
					if(y<=0) return false;
					detn=y;
				}else{
					if(x[a]+x[b]!=s) return false;
				}
			}
		}else{
			sg[b]=-sg[a];
			x[b]=s-x[a];
			if(!dfs(b)) return false;
		}
	}
	return true;
}

int main(){
	IR(n, m);
	REP(i, m){
		I(u,v)L(s);
		u--; v--;
		g[u].PB(MP(v,s));
		g[v].PB(MP(u,s));
	}
	fill(sg, sg+n, 0);
	ll ans=0;
	sg[0]=1; x[0]=0;
	if(dfs(0)){
		if(~detn){
			ans=1;
          	REP(i, n) if(sg[i]*detn+x[i]<=0) ans=0;
		}else{
			ll mi=1, mx=LLONG_MAX;
			REP(i, n){
				if(sg[i]==1){
					LAR(mi, 1-x[i]);
				}else{
					SML(mx, x[i]-1);
				}
			}
			ans=max(0LL, mx-mi+1);
		}
	}
	//REP(i, n){
	//	printf("[%d]=%cn+%lld\n", i, sg[i]==1?'+':sg[i]==-1?'-':'?', x[i]);
	//}
	printf("%lld\n", ans);
}


Measured memory_bytes: 12544