#include <iostream>
using namespace std;

const int MAX = 50;

struct info {
//.	int* list;
	int list[2700];
	int size;
} grid[MAX+1][MAX+1];	// grid[start location][length]

int value(char ch)
{
	switch (ch) {
	case 'I': return 1;
	case 'V': return 5;
	case 'X': return 10;
	case 'L': return 50;
	case 'C': return 100;
	default : cout << "ERROR: invalid character" << endl;
	}
	return 0;
}

int find(info& newlist, int val)
{
	int low = 0, high = newlist.size-1;
	while (low < high) {
		int mid = (low+high)/2;
		if (newlist.list[mid] < val)
			low = mid+1;
		else
			high = mid;
	}
	return low;
}

void insert(info& newlist, int val)
{
	if (newlist.size == 0) {
		newlist.list[0] = val;
		newlist.size++;
		return;
	}
	int index = find(newlist, val);
	if (newlist.list[index] == val)
		return;
	else if (newlist.list[index] < val)
		index++;
	for(int i=newlist.size; i>index; i--)
		newlist.list[i] = newlist.list[i-1];
	newlist.list[index] = val;
	newlist.size++;
}

void merge(int start, int len, info list1, info list2)
{
	for(int i=0; i<list1.size; i++) {
		for(int j=0; j<list2.size; j++) {
			if (list1.list[i] >= list2.list[j])
				insert(grid[start][len], list1.list[i] + list2.list[j]);
			else
				insert(grid[start][len], list2.list[j] - list1.list[i]);
		}
	}
}

int main()
{
	int icase=0;
	for(int i=0; i<MAX+1; i++)
		for(int j=0; j<MAX+1; j++)
			grid[i][j].size = 0;
//	for(int j=0; j<MAX+1; j++)
//		grid[j][1].list = new int[1];
	string s;
	cin >> s;
	while (s != "0") {
int sum = 0;
		icase++;
		int n = s.length();
		for(int j=0; j<n; j++) {
			grid[j][1].list[0] = value(s[j]);
			grid[j][1].size = 1;
		}
		for(int i=2; i<=n; i++) {
			for(int j=0; j<=n-i; j++) {
//				int maxsize = 0;
//				for(int k=1; k<i; k++) {
//					maxsize += grid[j][k].size*grid[j+1][i-k].size;
//				}
//				if (maxsize > 1500)
//					maxsize = 1500;
//sum += maxsize;
//				if (grid[j][i].size > 0)
//					delete [] grid[j][i].list;
//				grid[j][i].list = new int[maxsize];
				grid[j][i].size = 0;
				for(int k=1; k<i; k++) {
					merge(j, i, grid[j][k], grid[j+k][i-k]); 
				}
//cout << "list for " << s.substr(j, i) << ":";
//for(int ii=0; ii<grid[j][i].size; ii++)
//cout << ' ' << grid[j][i].list[ii];
//cout << endl;
			}
		}
		cout << "Case " << icase << ":";
		for(int i=0; i<grid[0][n].size; i++) {
			cout << ' ' << grid[0][n].list[i];
		}
		cout << endl;
//cout << "total allocation = " << sum << ", list size = " << grid[0][n].size << endl;

		cin >> s;
	}
}

