#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cfloat>
#include <ctime>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <numeric>
#include <list>

using namespace std;

#ifdef _MSC_VER
#define __typeof__ decltype
template <class T> int __builtin_popcount(T n) { return n ? 1 + __builtin_popcount(n & (n - 1)) : 0; }
#endif

#define foreach(it, c) for (__typeof__((c).begin()) it=(c).begin(); it != (c).end(); ++it)
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define popcount __builtin_popcount

#define rep(i, n) for (int i = 0; i < n; ++i)

template <class T> void max_swap(T& a, const T& b) { a = max(a, b); }
template <class T> void min_swap(T& a, const T& b) { a = min(a, b); }

const double EPS = 1e-10;
typedef long long ll;
typedef pair<int, int> pint;


int main()
{
	while (true)
	{
		string s;
		char to;
		cin >> s >> to;
		if (to == 'X')
			break;

		vector<string> words;
		s += '_';
		while (!s.empty())
		{
			s[0] = tolower(s[0]);
			for (int i = 0; i < s.size(); ++i)
			{
				if (s[i] == '_' || isupper(s[i]))
				{
					words.push_back(s.substr(0, i));
					words.back()[0] = words.back()[0];
					s.erase(0, i + (s[i] == '_' ? 1 : 0));
					break;
				}
			}
		}

		string res;
		if (to == 'U' || to == 'L')
		{
			if (to == 'U')
				words[0][0] = toupper(words[0][0]);
			res += words[0];
			for (int i = 1; i < words.size(); ++i)
			{
				words[i][0] = toupper(words[i][0]);
				res += words[i];
			}
		}
		else
			for (int i = 0; i < words.size(); ++i)
				res += words[i] + (i + 1 != words.size() ? "_" : "");
		cout << res << endl;
	}
}