#include<stdio.h>
#include<string.h>
#define MAX 20001

//水たまりの面積：S　何番目の文字列に水たまりがあるか:idx 
typedef struct Index{
   int idx;
   int S;
}Index;
 
 
//stackに\が入力された時、\が何番目かを入力する
void push1(int S[],int x,int *top){
   S[*top] = x;
   (*top)++;
   return;
}
 
//インデックス型のSに面積と何番目の文字列に水たまりがあるかstackで管理
void push2(Index S[],int idx,int s,int *top){
   S[*top].idx = idx;
   S[*top].S = s;
   (*top)++;
   return;
}
 
int pop(int S[],int *top){
   (*top)--;
   return S[*top];
}

//水たまりの結合
void Uni(Index S[],int *top){
   int i;
 
   for(i = (*top) - 1 ; i > 0 ; i--){
 
      //水たまりの場所が\を入力することで逆になった場合
      //2つの水たまりを結合させる
      if(S[i].idx < S[i-1].idx){
         (*top)--;
         S[i-1].idx = S[i].idx;
         S[i-1].S += S[i].S;
      }
   }
 
   return;
}
 
int main(){
   int i, j, idx, top1 = 0, top2 = 0, sum = 0;
   char str[MAX];
   int Stack1[MAX];
   Index Stack2[MAX];

   scanf("%s", str);

   for(i = 0 ; i < strlen(str) ; i++) {
      switch(str[i]) {
         case '\\':push1(Stack1, i, &top1);
                   break;
         case '/' :if(top1 == 0)
                      break;
                   idx = pop(Stack1, &top1);
                   sum += (i-idx);
                   push2(Stack2, idx, i - idx, &top2);
                   Uni(Stack2, &top2);
                   break;
      }
 
   }
   printf("%d\n", sum);
   if(top2 == 0) printf("%d\n", top2);
   else {
      printf("%d ", top2);
      for(i = 0 ; i < top2 - 1 ; i++) printf("%d ", Stack2[i].S);
      printf("%d\n", Stack2[top2-1].S);
   }
 
return 0;
}
