package main
import (
"bufio"
"fmt"
"os"
)
var parent []int
var maxNode []int
func find(i int) int {
if parent[i] == i {
return i
}
parent[i] = find(parent[i])
return parent[i]
}
func union(i, j int) {
rootI := find(i)
rootJ := find(j)
if rootI != rootJ {
parent[rootI] = rootJ
if maxNode[rootI] > maxNode[rootJ] {
maxNode[rootJ] = maxNode[rootI]
}
}
}
func readInt(reader *bufio.Reader) int {
var n int
var c byte
for {
c, _ = reader.ReadByte()
if c >= '0' && c <= '9' {
break
}
}
n = int(c - '0')
for {
c, _ = reader.ReadByte()
if c < '0' || c > '9' {
break
}
n = n*10 + int(c-'0')
}
return n
}
func main() {
reader := bufio.NewReader(os.Stdin)
n := readInt(reader)
m := readInt(reader)
parent = make([]int, n+1)
maxNode = make([]int, n+1)
for i := 1; i <= n; i++ {
parent[i] = i
maxNode[i] = i
}
for i := 0; i < m; i++ {
u := readInt(reader)
v := readInt(reader)
union(u, v)
}
ans := 0
currentMax := maxNode[find(1)]
root := find(1)
for i := 1; i <= n; i++ {
if i < currentMax {
if find(i) != root {
union(root, i)
ans++
root = find(root)
currentMax = maxNode[root]
}
} else if i > currentMax {
root = find(i)
currentMax = maxNode[root]
}
}
fmt.Println(ans)
}