← Home
package main

import (
	"bufio"
	"io"
	"os"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0

	readInt := func() int {
		for idx < len(data) && data[idx] <= 32 {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] > 32 {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	readToken := func() []byte {
		for idx < len(data) && data[idx] <= 32 {
			idx++
		}
		start := idx
		for idx < len(data) && data[idx] > 32 {
			idx++
		}
		return data[start:idx]
	}

	n := readInt()
	m := readInt()

	grid := make([][]byte, n)
	rmin, rmax := n, -1
	cmin, cmax := m, -1

	for i := 0; i < n; i++ {
		row := readToken()
		grid[i] = row
		for j, b := range row {
			if b == 'w' {
				if i < rmin {
					rmin = i
				}
				if i > rmax {
					rmax = i
				}
				if j < cmin {
					cmin = j
				}
				if j > cmax {
					cmax = j
				}
			}
		}
	}

	wr := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer wr.Flush()

	printNo := func() {
		wr.WriteString("-1\n")
	}

	h := rmax - rmin + 1
	w := cmax - cmin + 1

	valid := true
	hasCmin, hasCmax := false, false
	hasRmin, hasRmax := false, false

	for i := 0; i < n && valid; i++ {
		for j, b := range grid[i] {
			if b != 'w' {
				continue
			}
			if !(i == rmin || i == rmax || j == cmin || j == cmax) {
				valid = false
				break
			}
			if h > w && i > rmin && i < rmax {
				if j == cmin {
					hasCmin = true
				}
				if j == cmax {
					hasCmax = true
				}
			}
			if w > h && j > cmin && j < cmax {
				if i == rmin {
					hasRmin = true
				}
				if i == rmax {
					hasRmax = true
				}
			}
		}
	}

	if !valid {
		printNo()
		return
	}

	top, left, d := 0, 0, 0

	if h == w {
		top = rmin
		left = cmin
		d = h
	} else if h > w {
		d = h
		llo := cmax - d + 1
		if llo < 0 {
			llo = 0
		}
		lhi := cmin
		if m-d < lhi {
			lhi = m - d
		}
		if llo > lhi {
			printNo()
			return
		}

		cnt := 0
		if hasCmin {
			cnt++
		}
		if cmax != cmin && hasCmax {
			cnt++
		}
		if cnt == 2 {
			printNo()
			return
		}
		if cnt == 0 {
			left = llo
		} else {
			x := cmin
			if !hasCmin {
				x = cmax
			}
			ok := false
			cand1 := x
			if cand1 >= llo && cand1 <= lhi {
				left = cand1
				ok = true
			}
			cand2 := x - d + 1
			if !ok && cand2 >= llo && cand2 <= lhi {
				left = cand2
				ok = true
			}
			if !ok {
				printNo()
				return
			}
		}
		top = rmin
	} else {
		d = w
		tlo := rmax - d + 1
		if tlo < 0 {
			tlo = 0
		}
		thi := rmin
		if n-d < thi {
			thi = n - d
		}
		if tlo > thi {
			printNo()
			return
		}

		cnt := 0
		if hasRmin {
			cnt++
		}
		if rmax != rmin && hasRmax {
			cnt++
		}
		if cnt == 2 {
			printNo()
			return
		}
		if cnt == 0 {
			top = tlo
		} else {
			x := rmin
			if !hasRmin {
				x = rmax
			}
			ok := false
			cand1 := x
			if cand1 >= tlo && cand1 <= thi {
				top = cand1
				ok = true
			}
			cand2 := x - d + 1
			if !ok && cand2 >= tlo && cand2 <= thi {
				top = cand2
				ok = true
			}
			if !ok {
				printNo()
				return
			}
		}
		left = cmin
	}

	bottom := top + d - 1
	right := left + d - 1

	if top < 0 || left < 0 || bottom >= n || right >= m {
		printNo()
		return
	}

	for i := 0; i < n && valid; i++ {
		for j, b := range grid[i] {
			if b != 'w' {
				continue
			}
			if !(i >= top && i <= bottom && j >= left && j <= right && (i == top || i == bottom || j == left || j == right)) {
				valid = false
				break
			}
		}
	}

	if !valid {
		printNo()
		return
	}

	for j := left; j <= right; j++ {
		if grid[top][j] == '.' {
			grid[top][j] = '+'
		}
		if bottom != top && grid[bottom][j] == '.' {
			grid[bottom][j] = '+'
		}
	}
	for i := top + 1; i < bottom; i++ {
		if grid[i][left] == '.' {
			grid[i][left] = '+'
		}
		if right != left && grid[i][right] == '.' {
			grid[i][right] = '+'
		}
	}

	for i := 0; i < n; i++ {
		wr.Write(grid[i])
		wr.WriteByte('\n')
	}
}