import java.util.*

fun findFloodsEndIndex(region: String, index: Int): Int {
    // 下り斜面までskip
    var findIndex = region.indexOf("\\", index)
    // 下り斜面がなかったら終了
    if (findIndex == -1) {
        return findIndex
    }
    // 下り斜面開始位置と同じ高さ or 一番高い上り斜面の終わり位置を返す
    findIndex++
    var depth = 1
    var minDepth = Int.MAX_VALUE
    var endIndex = -1
    while (findIndex < region.length) {
        if (region[findIndex] == '\\') {
            depth++
        } else if (region[findIndex] == '/') {
            depth--
            if (depth < minDepth) {
                endIndex = findIndex
                minDepth = depth
            }
        }
        if (depth == 0) {
            return findIndex
        }
        findIndex++
    }
    return endIndex
}

fun calcFloodsArea(region: String, index: Int): Int {
    var area = 0.0
    var depth = 0
    for (i in index downTo 0) {
        when(region[i]) {
            '/' -> {
                area += depth
                depth++
                area += 0.5
            }
            '\\' -> {
                area += 0.5
                depth--
                area += depth
            }
            else -> {
                area += depth
            }
        }
        if (depth == 0) {
            break
        }
    }
    return area.toInt()
}

fun main(args: Array<String>) {
    val scanner = Scanner(System.`in`)
    val region = scanner.nextLine()
    val floodsAreas = mutableListOf<Int>()

    var index = 0
    while (index < region.length) {
        // 水たまりの最後の位置を返す
        index = findFloodsEndIndex(region, index)
        // 水たまりが見つからなかった場合は終了
        if (index == -1) {
            break
        }
        // 水たまりの面積を算出
        floodsAreas.add(calcFloodsArea(region, index))
        index++
    }
    println(floodsAreas.sum())
    print(floodsAreas.size)
    if (floodsAreas.size > 0) {
        println(" " + floodsAreas.joinToString(" "))
    } else {
        println()
    }
}
