/*
	Source Code by adityaghosh996
*/
#include<bits/stdc++.h>
#define ll long long int
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
using namespace std;
string name[1000000];
vector<ll> child;
vector<string> level[1000000];
bool vis[1000000];
ll n,pos=0,minuend=0;
inline bool isnum(string s)
{
    for(ll i=0;i<s.length();i++)
    {
        if(!isdigit(s[i]))
            return false;
    }
    return true;
}
inline ll numval(string s)
{
    ll val=0;
    for(ll i=0;i<s.length();i++)
    {
        int d=s[i]-'0';
        val=val*10+d;
    }
    return val;
}
inline void dfs(ll curr_level)
{
    level[curr_level-minuend].pb(name[pos]);
    vis[pos]=true;
    ll ch=child[pos];
    pos++;
    for(ll i=0;i<ch;i++)
    {
        dfs(curr_level+1);
    }
    return;
}
int main()
{
	ios_base::sync_with_stdio(0);;cin.tie(0);
    memset(vis,false,sizeof(vis));
    string s;
    cin>>s;
    vector<string> total;
    string temp="";
    for(ll i=0;i<s.length();i++)
    {
        if(s[i]==',')
        {
            total.pb(temp);
            temp="";
        }
        else
            temp=temp+s[i];
    }
    total.pb(temp);
    ll cnt=0;
    for(ll i=0;i<total.size();i++)
    {
        if(isnum(total[i]))
        {
            child.pb(numval(total[i]));
            cnt++;
        }
        else
        {
            name[cnt]=total[i];
        }
    }
    n=child.size();
    while(pos<n)
    {
    	minuend=pos;
		dfs(pos);
	}
	ll tlev=0;
    for(ll i=0;i<1000000;i++)
    {
    	tlev++;
        if(level[i].size()==0)
            break;
    }
    cout<<tlev-1<<endl;
    for(ll i=0;i<1000000;i++)
    {
        if(level[i].size()==0)
            break;
        for(ll j=0;j<level[i].size();j++)
            cout<<level[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}