Problem:
Score : 600 points

Problem Statement

Kenkoooo found a simple connected graph.
The vertices are numbered 1 through n.
The i-th edge connects Vertex u_i and v_i, and has a fixed integer s_i.

Kenkoooo is trying to write a positive integer in each vertex so that the following condition is satisfied:

For every edge i, the sum of the positive integers written in Vertex u_i and v_i is equal to s_i.

Find the number of such ways to write positive integers in the vertices.

Constraints

2 \leq n \leq 10^5

1 \leq m \leq 10^5

1 \leq u_i < v_i \leq n

2 \leq s_i \leq 10^9

If i\neq j, then u_i \neq u_j or v_i \neq v_j.

The graph is connected.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

n m
u_1 v_1 s_1
:
u_m v_m s_m

Output

Print the number of ways to write positive integers in the vertices so that the condition is satisfied.

Sample Input 1

3 3
1 2 3
2 3 5
1 3 4

Sample Output 1

1

The condition will be satisfied if we write 1,2 and 3 in vertices 1,2 and 3, respectively.
There is no other way to satisfy the condition, so the answer is 1.

Sample Input 2

4 3
1 2 6
2 3 7
3 4 5

Sample Output 2

3

Let a,b,c and d be the numbers to write in vertices 1,2,3 and 4, respectively.
There are three quadruples (a,b,c,d) that satisfy the condition:

(a,b,c,d)=(1,5,2,3)

(a,b,c,d)=(2,4,3,2)

(a,b,c,d)=(3,3,4,1)

Sample Input 3

8 7
1 2 1000000000
2 3 2
3 4 1000000000
4 5 2
5 6 1000000000
6 7 2
7 8 1000000000

Sample Output 3

0

Solution in C (GCC 9.2.1) (judge verdict: Accepted)

#include <stdio.h>

typedef struct List {
	struct List *next;
	int v;
	long long sum;
} list;

int main()
{
	int i, n, m, u, w;
	long long c;
	list *adj[100001] = {}, e[200001], *p;
	scanf("%d %d", &n, &m);
	for (i = 0; i < m; i++) {
		scanf("%d %d %lld", &u, &w, &c);
		e[i*2].v = w;
		e[i*2+1].v = u;
		e[i*2].sum = c;
		e[i*2+1].sum = c;
		e[i*2].next = adj[u];
		e[i*2+1].next = adj[w];
		adj[u] = &(e[i*2]);
		adj[w] = &(e[i*2+1]);
	}
	
	int flag[100001] = {}, q[100001] = {}, head, tail;
	long long x[100001];
	q[0] = 1;
	flag[1] = 1;
	x[1] = 0;
	for (head = 0, tail = 1; head < tail; head++) {
		u = q[head];
		for (p = adj[u]; p != NULL; p = p->next) {
			w = p->v;
			if (flag[w] == 0) {
				flag[w] = -flag[u];
				x[w] = p->sum - x[u];
				q[tail++] = w;
			}
		}
	}
	
	for (i = 0; i < m; i++) {
		u = e[i*2].v;
		w = e[i*2+1].v;
		c = e[i*2].sum;
		if (flag[u] == flag[w]) {
			if ((x[u] + x[w] + c) % 2 != 0) {
				printf("0\n");
				fflush(stdout);
				return 0;
			} else {
				q[0] = u;
				q[1] = w;
				x[u] += (c - x[u] - x[w]) / 2;
				x[w] = c - x[u];
				flag[u] = 0;
				flag[w] = 0;
				for (head = 0, tail = 2; head < tail; head++) {
					u = q[head];
					for (p = adj[u]; p != NULL; p = p->next) {
						w = p->v;
						if (flag[w] != 0) {
							flag[w] = 0;
							x[w] = p->sum - x[u];
							q[tail++] = w;
						} else if (x[u] + x[w] != p->sum) {
							printf("0\n");
							fflush(stdout);
							return 0;
						}
					}
				}
				
				for (u = 1; u <= n; u++) if (x[u] <= 0) break;
				if (u <= n) printf("0\n");
				else printf("1\n");
				fflush(stdout);
				return 0;
			}
		} else if (x[u] + x[w] != c) {
			printf("0\n");
			fflush(stdout);
			return 0;
		}
	}
	
	long long min[2] = {(long long)1 << 60, (long long)1 << 60};
	for (u = 1; u <= n; u++) if (x[u] < min[(flag[u]+1)/2]) min[(flag[u]+1)/2] = x[u];
	if (min[0] + min[1] < 2) printf("0\n");
	else printf("%lld\n", min[0] + min[1] - 1);
	fflush(stdout);
	return 0;
}