package main
import (
"bufio"
"fmt"
"os"
)
type Edge struct {
x, y int
}
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
var n, m int
if _, err := fmt.Fscan(in, &n, &m); err != nil {
return
}
deg := make([]int, n+1)
for i := 0; i < m; i++ {
var x, y int
fmt.Fscan(in, &x, &y)
if x == y {
deg[x] += 2
} else {
deg[x]++
deg[y]++
}
}
if m > n {
fmt.Fprintln(out, "NO")
return
}
for i := 1; i <= n; i++ {
if deg[i] > 2 {
fmt.Fprintln(out, "NO")
return
}
}
need := make([]int, n+1)
for i := 1; i <= n; i++ {
need[i] = 2 - deg[i]
}
ans := make([]Edge, 0, n-m)
for {
i := 1
for i <= n && need[i] == 0 {
i++
}
if i > n {
break
}
if need[i] >= 2 {
ans = append(ans, Edge{i, i})
need[i] -= 2
} else {
j := i + 1
for j <= n && need[j] == 0 {
j++
}
if j > n {
fmt.Fprintln(out, "NO")
return
}
ans = append(ans, Edge{i, j})
need[i]--
need[j]--
}
}
fmt.Fprintln(out, "YES")
fmt.Fprintln(out, len(ans))
for _, e := range ans {
fmt.Fprintln(out, e.x, e.y)
}
}