```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type Seat struct {
r, c, cost int
}
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n, k int
fmt.Fscan(reader, &n, &k)
grid := make([][]byte, n)
var candidates []Seat
for i := 0; i < n; i++ {
var s string
fmt.Fscan(reader, &s)
grid[i] = []byte(s)
for j, char := range grid[i] {
if char == '.' {
cost := 0
if j > 0 && grid[i][j-1] == 'S' {
cost++
}
if j < len(grid[i])-1 && grid[i][j+1] == 'S' {
cost++
}
candidates = append(candidates, Seat{i, j, cost})
}
}
}
sort.Slice(candidates, func(i, j int) bool {
return candidates[i].cost < candidates[j].cost
})
for i := 0; i < k; i++ {
seat := candidates[i]
grid[seat.r][seat.c] = 'x'
}
totalNeighbors := 0
for i := 0; i < n; i++ {
for j, char := range grid[i] {
if char == 'S' {
if j > 0 {
left := grid[i][j-1]
if left == 'S' || left == 'P' || left == 'x' {
totalNeighbors++
}
}
if j < len(grid[i])-1 {
right := grid[i][j+1]
if right == 'S' || right == 'P' || right == 'x' {
totalNeighbors++
}
}
}
}
}
fmt.Fprintln(writer, totalNeighbors)
for i := 0; i < n; i++ {
fmt.Fprintln(writer, string(grid[i]))
}
}
```