def get_i() #空白区切の入力を数値(整数)の配列で返す
  return gets.chomp.split(" ").map(&:to_i)
end
def get_f() #空白区切の入力を数値(実数)の配列で返す
  return gets.chomp.split(" ").map(&:to_f)
end
def get() #空白区切の入力を文字列の配列で返す
  return gets.chomp.split(" ")
end
def get_nsp() #入力されたものを一文字ずつに区切った文字列の配列で返す
  return gets.chomp.split("")
end
def yn_judge(bool,y="Yes",n="No") #boolに真偽を投げることで、trueならy、falseならnの値を出力する
  return bool ? y : n 
end
def array(size,n=1,init=nil) #nに配列の次元数、sizeに配列の大きさ、initに初期値を投げることでその配列を返す
  if n==1
    return Array.new(size){init}
  else
    return Array.new(n).map{Array.new(size){init}}
  end
end

loop do
  word,type=get
  w_=word.split("_")
  new_word=[]
  if w_.size==1
    w_Nsp=word.split("")
    temp=""
    w_Nsp.each_with_index do|c,i|
      if i.nonzero? and c==c.upcase
        new_word.push(temp)
        temp=""
        temp+=c.downcase
      else
        temp+=c.downcase
      end 
    end
    new_word.push(temp)
    word=new_word
  else
    word=w_
  end
  case type
  when "X" then
    break
  when "L" then
    ans=word[0]
    word.shift
    word.each do|str|
      str_spl=str.split("")
      i=0
      str_spl.each do|c|
        if i.zero?
          ans+=c.upcase
          i+=1
        else
          ans+=c
        end
      end
    end
    puts ans
  when "U" then
    ans=""
    word.each do|str|
      str_spl=str.split("")
      i=0
      str_spl.each do|c|
        if i.zero?
          ans+=c.upcase
          i+=1
        else
          ans+=c
        end 
      end
    end
    puts ans
  when "D" then
    puts word.join("_")
  end
end
