← Home
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

const NEG int = -1 << 60

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
	sign := 1
	if fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		val = val*10 + int(c-'0')
		fs.idx++
	}
	return sign * val
}

func identity(n int) []int {
	a := make([]int, n*n)
	for i := range a {
		a[i] = NEG
	}
	for i := 0; i < n; i++ {
		a[i*n+i] = 0
	}
	return a
}

func mul(a, b []int, n int) []int {
	c := make([]int, n*n)
	for i := range c {
		c[i] = NEG
	}
	for i := 0; i < n; i++ {
		ai := i * n
		ci := c[ai : ai+n]
		for k := 0; k < n; k++ {
			av := a[ai+k]
			if av == NEG {
				continue
			}
			bk := k * n
			for j := 0; j < n; j++ {
				bv := b[bk+j]
				if bv == NEG {
					continue
				}
				v := av + bv
				if v > ci[j] {
					ci[j] = v
				}
			}
		}
	}
	return c
}

func hasPositiveDiag(a []int, n int) bool {
	for i := 0; i < n; i++ {
		if a[i*n+i] > 0 {
			return true
		}
	}
	return false
}

func main() {
	fs := NewFastScanner()
	n := fs.NextInt()
	m := fs.NextInt()

	base := identity(n)
	found2 := false

	for t := 0; t < m; t++ {
		i := fs.NextInt() - 1
		j := fs.NextInt() - 1
		cij := fs.NextInt()
		cji := fs.NextInt()
		base[i*n+j] = cij
		base[j*n+i] = cji
		if cij+cji > 0 {
			found2 = true
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 64)
	defer out.Flush()

	if found2 {
		out.WriteString("2\n")
		return
	}

	pows := make([][]int, 0, 10)
	pows = append(pows, base)
	for size := 1; size*2 <= n; size *= 2 {
		pows = append(pows, mul(pows[len(pows)-1], pows[len(pows)-1], n))
	}

	cur := identity(n)
	lenNo := 0

	for b := len(pows) - 1; b >= 0; b-- {
		step := 1 << uint(b)
		if lenNo+step > n {
			continue
		}
		var cand []int
		if lenNo == 0 {
			cand = pows[b]
		} else {
			cand = mul(cur, pows[b], n)
		}
		if !hasPositiveDiag(cand, n) {
			lenNo += step
			cur = cand
		}
	}

	ans := 0
	if lenNo < n {
		ans = lenNo + 1
	}
	out.WriteString(strconv.Itoa(ans))
	out.WriteByte('\n')
}