```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)
}
}
```