def main():
    ### 初期設定 ###
    n, m = map(int, input().split())
    uvs = [list(map(int, input().split())) for _ in [0]*m]
    g = [[] for _ in [0]*n]
    [g[a-1].append([b-1, c]) for a, b, c in uvs]
    [g[b-1].append([a-1, c]) for a, b, c in uvs]

    ### 閉路検出 ###
    # やるべきこと
    # DFSで閉路を見つける
    # ・奇閉路が見つかったとき
    # ⇒答えは高々一つなので探索打ち切り。
    # ⇒閉路=[a1,a2,a3,a4,a5]
    # ⇒閉路の辺=[s1,s2,s3,s4,s5]のとき、
    # ⇒a1=((s1+s3+s5)-(s2+s4))//2 に固定される。
    # ・偶閉路が見つかったとき
    # ⇒閉路=[a1,a2,a3,a4,a5,a6]
    # ⇒閉路の辺=[s1,s2,s3,s4,s5,s6]のとき、
    # ⇒S=s1+s3+s5-s2-s4-s6を計算する。
    # ⇒S=0ならば探索を続行する。
    # ⇒S!=0ならば0を出力して強制終了。

    g2 = [{(j, k) for j, k in gg} for gg in g]  # グラフのset化
    q = [0]  # 探索用キュー
    q_dict = {0: 0}  # 頂点がqの中の何番目か
    ac_even = [0]  # 累積和（偶数）
    ac_odd = [0]  # 累積和（奇数）
    flag = False  # 奇閉路があるかどうか
    while q:
        i = q[-1]
        # 行先があった場合
        if g2[i]:
            j, k = g2[i].pop()
            g2[j].remove((i, k))
            # 閉路検出時
            if j in q_dict:
                l = q_dict[j]
                loop_size = len(q)-l
                if len(q) % 2 == 1:
                    ac_even.append(ac_even[-1]+k)
                else:
                    ac_odd.append(ac_odd[-1]+k)
                # 偶閉路があったとき
                if loop_size % 2 == 0:
                    # ダメな感じの閉路なら終了、それ以外は続行
                    if ac_even[-1]-ac_even[-loop_size//2-1] != ac_odd[-1]-ac_odd[-loop_size//2-1]:
                        print(0)
                        return
                    if len(q) % 2 == 1:
                        ac_even.pop()
                    else:
                        ac_odd.pop()
                # 奇閉路があったとき
                else:
                    flag = True
                    if len(q) % 2 == 1:
                        s = ac_even[-1]-ac_even[-loop_size//2-1] - \
                            ac_odd[-1]+ac_odd[-loop_size//2]
                    else:
                        s = ac_odd[-1]-ac_odd[-loop_size//2-1] - \
                            ac_even[-1]+ac_even[-loop_size//2]
                    if s <= 0 or s % 2 != 0:
                        print(0)
                        return
                    else:
                        ini = [j, s//2]
                        break
            # それ以外
            else:
                q_dict[j] = len(q)
                q.append(j)
                if len(q) % 2 == 0:
                    ac_even.append(ac_even[-1]+k)
                else:
                    ac_odd.append(ac_odd[-1]+k)
        # なかったとき
        else:
            if len(q) % 2 == 0:
                ac_even.pop()
            else:
                ac_odd.pop()
            q.pop()
            q_dict.pop(i)

    ### 探索終了後（奇閉路ありの場合） ###
    # ⇒先程決めた頂点からDFSをスタート。
    # ⇒矛盾が生じたら終了、生じなかったら1を出力。
    g2 = [{(j, k) for j, k in gg} for gg in g]  # グラフのset化
    if flag:
        i, j = ini
        visited = [-1]*n
        visited[i] = j
        q = [i]
        while q:
            i = q[-1]
            j = visited[i]
            if g2[i]:
                k, l = g2[i].pop()
                q.append(k)
                g2[k].remove((i, l))
                new = l-j
                if new <= 0:
                    print(0)
                    return
                if visited[k] == -1:
                    visited[k] = new
                elif visited[k] != new:
                    print(0)
                    return
            else:
                q.pop()
        print(1)
    ### 探索終了後（奇閉路なしの場合） ###
    # ⇒どこかの頂点からDFSをスタート。
    # ⇒各頂点の取りうる値の範囲を1～10**9からスタートさせ、
    # ⇒徐々に狭めていく。
    # ⇒戻る際に過去に通った点にも随時更新をかけていく。
    else:
        visited = [None]*n
        visited[0] = [1, 10**9]
        q = [0]
        s = []
        while q:
            i = q[-1]
            m, M = visited[i]
            if g2[i]:
                j, k = g2[i].pop()
                q.append(j)
                s.append(k)
                g2[j].remove((i, k))
                newM = max(k-m, 0)
                newm = max(k-M, 1)
                if newM == 0:
                    print(0)
                    return
                if visited[j] != None:
                    newM = min(newM, visited[j][1])
                    newm = max(newm, visited[j][0])
                    if newm > newM:
                        print(0)
                        return
                visited[j] = [newm, newM]
            else:
                q.pop()
                if q:
                    j = q[-1]
                    k = s.pop()
                    m, M = visited[i]
                    newM = max(k-m, 0)
                    newm = max(k-M, 1)
                    if newM == 0:
                        print(0)
                        return
                    if visited[j] != None:
                        newM = min(newM, visited[j][1])
                        newm = max(newm, visited[j][0])
                        if newm > newM:
                            print(0)
                            return
                    visited[j] = [newm, newM]
        print(visited[0][1]-visited[0][0]+1)


main()


Measured memory_bytes: 145660