← Home
```go
package main

import "fmt"

var lucky []int

func gen(num int, digs int) {
	if digs > 5 {
		return
	}
	if num > 0 {
		lucky = append(lucky, num)
	}
	gen(num*10+4, digs+1)
	gen(num*10+7, digs+1)
}

func main() {
	gen(4, 1)
	gen(7, 1)
	var n, m int
	fmt.Scan(&n, &m)
	parent := make([]int, n+1)
	sz := make([]int, n+1)
	for i := 1; i <= n; i++ {
		parent[i] = i
		sz[i] = 1
	}
	var find func(int) int
	find = func(x int) int {
		if parent[x] != x {
			parent[x] = find(parent[x])
		}
		return parent[x]
	}
	union := func(x, y int) {
		px := find(x)
		py := find(y)
		if px == py {
			return
		}
		if sz[px] < sz[py] {
			px, py = py, px
		}
		parent[py] = px
		sz[px] += sz[py]
	}
	for i := 0; i < m; i++ {
		var u, v int
		fmt.Scan(&u, &v)
		if u != v {
			union(u, v)
		}
	}
	var sizes []int
	for i := 1; i <= n; i++ {
		if parent[i] == i {
			sizes = append(sizes, sz[i])
		}
	}
	const Tt = 80
	const Maxl = 77787
	const Inf = 200010
	dp := make([]int, Maxl)
	for i := 0; i < Maxl; i++ {
		dp[i] = Inf
	}
	dp[0] = 0
	freq := make([]int, n+1)
	for _, s := range sizes {
		freq[s]++
	}
	for s := Tt; s <= n; s++ {
		if freq[s] > 0 {
			for k := 0; k < freq[s]; k++ {
				add_size := s
				if add_size >= Maxl {
					continue
				}
				for j := Maxl - 1; j >= add_size; j-- {
					if dp[j-add_size] < Inf {
						newc := dp[j-add_size] + 1
						if newc < dp[j] {
							dp[j] = newc
						}
					}
				}
			}
		}
	}
	for s := 1; s < Tt; s++ {
		if freq[s] == 0 {
			continue
		}
		remaining := freq[s]
		power := 1
		for remaining > 0 {
			use := power
			if use > remaining {
				use = remaining
			}
			add_size := use * s
			add_cost := use
			if add_size >= Maxl {
				break
			}
			for j := Maxl - 1; j >= add_size; j-- {
				if dp[j-add_size] < Inf {
					newc := dp[j-add_size] + add_cost
					if newc < dp[j] {
						dp[j] = newc
					}
				}
			}
			remaining -= use
			power *= 2
		}
	}
	minr := Inf
	for _, l := range lucky {
		if l < Maxl && dp[l] < Inf {
			r := dp[l] - 1
			if r < minr {
				minr = r
			}
		}
	}
	if minr == Inf {
		fmt.Println(-1)
	} else {
		fmt.Println(minr)
	}
}
```