package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReaderSize(os.Stdin, 1024*1024)
line, _ := reader.ReadString('\n')
s := strings.TrimSpace(line)
n := len(s)
type state struct {
length int
prefix string
suffix string
first byte
diff byte
}
dp := make([]state, n+2)
for i := n - 1; i >= 0; i-- {
keep := state{}
keep.length = 1 + dp[i+1].length
keep.first = s[i]
if dp[i+1].length == 0 {
keep.diff = 0
} else if dp[i+1].first != s[i] {
keep.diff = dp[i+1].first
} else {
keep.diff = dp[i+1].diff
}
if dp[i+1].length <= 10 {
fullStr := string(s[i]) + dp[i+1].prefix
if len(fullStr) > 10 {
keep.prefix = fullStr[:5]
keep.suffix = fullStr[len(fullStr)-2:]
} else {
keep.prefix = fullStr
keep.suffix = ""
}
} else {
keep.prefix = string(s[i]) + dp[i+1].prefix[:4]
keep.suffix = dp[i+1].suffix
}
takeDelete := false
if i+1 < n && s[i] == s[i+1] {
x := byte(0)
if dp[i+2].length > 0 {
if dp[i+2].first != s[i] {
x = dp[i+2].first
} else {
x = dp[i+2].diff
}
}
if s[i] > x {
takeDelete = true
}
}
if takeDelete {
dp[i] = dp[i+2]
} else {
dp[i] = keep
}
}
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
for i := 0; i < n; i++ {
fmt.Fprintf(out, "%d ", dp[i].length)
if dp[i].length <= 10 {
fmt.Fprintln(out, dp[i].prefix)
} else {
fmt.Fprintf(out, "%s...%s\n", dp[i].prefix, dp[i].suffix)
}
}
}