import Data.Char (ord, chr)
import Data.List (isInfixOf)
import System.IO (isEOF)

main = do
    quit <- isEOF
    if quit then return () else do
        line <- getLine
        putStrLn $ decipher line
        main

rotate :: String -> Int -> String
s `rotate` n = map (rotateChar n) s
    where
    rotateChar n c
        | ord c >= ord 'a' && ord c <= ord 'z'
            = chr (((ord c) - (ord 'a') + n) `mod` 26 + (ord 'a'))
        | otherwise
            = c

containsAny :: String -> [String] -> Bool
s `containsAny` ws = any (`isInfixOf` s) ws

decipher :: String -> String
decipher s = head $ filter (`containsAny` ["the","this","that"]) $ map (s `rotate`) [0..25]