```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
buf := make([]byte, 0, 1024*1024)
scanner.Buffer(buf, 1024*1024)
scanner.Split(bufio.ScanWords)
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
present := make([]bool, 26)
nextChar := make([]int, 26)
prevChar := make([]int, 26)
for i := 0; i < 26; i++ {
nextChar[i] = -1
prevChar[i] = -1
}
for i := 0; i < n; i++ {
if !scanner.Scan() {
break
}
s := scanner.Text()
for j := 0; j < len(s); j++ {
present[s[j]-'a'] = true
}
for j := 0; j < len(s)-1; j++ {
u := int(s[j] - 'a')
v := int(s[j+1] - 'a')
if nextChar[u] != -1 && nextChar[u] != v {
fmt.Println("NO")
return
}
if prevChar[v] != -1 && prevChar[v] != u {
fmt.Println("NO")
return
}
nextChar[u] = v
prevChar[v] = u
}
}
visited := make([]bool, 26)
var paths []string
for i := 0; i < 26; i++ {
if present[i] && prevChar[i] == -1 {
var path []byte
curr := i
for curr != -1 {
if visited[curr] {
break
}
visited[curr] = true
path = append(path, byte(curr+'a'))
curr = nextChar[curr]
}
paths = append(paths, string(path))
}
}
for i := 0; i < 26; i++ {
if present[i] && !visited[i] {
fmt.Println("NO")
return
}
}
sort.Strings(paths)
fmt.Println(strings.Join(paths, ""))
}
```