#include <stdio.h>
#include <vector>
#include <list>
#include <array>
#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#include <stdexcept>
#include <tuple>
#include <numeric>

#include <string.h>

using std::string;
using std::vector;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// util
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

std::vector<std::string> split(const std::string& input, char delimiter)
{
    std::istringstream stream(input);

    std::string field;
    std::vector<std::string> result;
    while (std::getline(stream, field, delimiter)) {
        result.push_back(field);
    }
    return result;
}

void printList(const vector<int>& list) {
    // print
    for(int i = 0; i < list.size(); i++){
        printf("%d", list[i]);
        if(i != list.size() -1){
            printf(" ");
        }
    }
    printf("\n");
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// user func
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// index (絶対値) を返す なかったら -1
int findRightEdge(int begin, char* mountain) {
    // printf("begin:%d\n", begin);

    int currentHeight = -1;
    int i = begin + 1;

    for( ; mountain[i] != '\0'; i++) {
        switch(mountain[i]){
            case '\\' : {
                currentHeight--;
                break;
            }
            case '/' : {
                currentHeight++;
                if (currentHeight == 0) {   
                    return i;
                }
                break;
            }
            case '_' : {
                break;
            }
        }
    }
    return - 1;
}

int calcArea(int begin, int end, char* mountain){
    // printf("begin:%d, end:%d\n", begin, end);
    vector<std::pair<char, int>> stack;
    int area = 0;
    for(int i = begin; i <= end; i++){
        switch(mountain[i]) {
            case '\\': {
                stack.push_back(std::make_pair(mountain[i], i));
                break;
            }
            case '/': {
                if(stack.empty()) break;
                auto left = stack.back();
                stack.pop_back();
                area += i - left.second;
                break;
            }
            case '_' : {
                break;
            }
        }
    }
    // printf("area:%d\n", area);
    return area;
}

void solve() {
    // input
    char buffer[20001];
    memset(buffer, '\0', 20001);
    scanf("%s", buffer);

    // define result
    int totalArea = 0;
    vector<int> pools;
    // traverse
    for(int i = 0; buffer[i] != '\0'; i++){
        // not start point
        if(buffer[i] == '_' || buffer[i] == '/'){
            continue;
        }


        int rightEdgeIndex = findRightEdge(i, buffer);
        // printf("RE: %d\n", rightEdgeIndex);
        if (rightEdgeIndex == -1) continue;

        // found pool
        int area = calcArea(i, rightEdgeIndex, buffer);
        totalArea += area;
        pools.push_back(area);
        i = rightEdgeIndex;
    }

    if(pools.size() == 0){
        printf("0\n0\n");
    } else {
        printf("%d\n", totalArea);
        printf("%zu ", pools.size());
        printList(pools);
    }
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// main
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main() {
    /* \\\\/_/\\///_ */
    solve();
    return 0;
}


Measured memory_bytes: 3304