Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

var scanner = bufio.NewScanner(os.Stdin)

func nextString() string {
	scanner.Scan()
	return scanner.Text()
}

func incrementByte(b byte) byte {
	if b >= 97 && b < 122 {
		return b + 1
	} else if b == 122 {
		return 97
	}
	return b
}

func main() {
	scanner.Split(bufio.ScanLines)

	for {
		line := nextString()
		if len(line) == 0 {
			break
		}
		for i := 0; i <= 26; i++ {
			decoded := []byte{}
			for j := 0; j < len(line); j++ {
				decoded = append(decoded, incrementByte(line[j]))
			}
			line = string(decoded)
			if strings.Contains(line, "the") || strings.Contains(line, "this") || strings.Contains(line, "that") {
				fmt.Println(line)
				break
			}
		}
	}
}

C++: #include<iostream>
#include<string>
using namespace std;
main(){
	string str;
	int tmp,b;
	while(getline(cin,str)){
		tmp='t'-str[0];
		for(int i=0;i<str.size();++i){
			if(str[i]>='a' && str[i]<='z'){
				if(str[i]>='m')str[i]-=26;
				str[i]+=tmp;
				if(str[i]<'a')str[i]+=26;
				else if(str[i]>'z')str[i]-=26;
			}
		}
		string str2="    ";
		for(int i=0;i<=3,i<=3;++i)str2[i]=str[i];
		if(str2=="this" || str2=="the " || str2=="that")cout<<str<<endl;
	}
}

C++: /*
NOTE :
*min_element(.begin(),.end())
*max_element(.begin(),.end())
stack push pop top
queue push pop front
priority_queue<> pq
 push()  pop() size()  top()
map<>
 find() begin() end() insert(map<>::value_type())
pair<>
sort(.begin(), .end())
sort(arr, arr+N)
sort(a, a+N, greater<int>())
binary_search(vc.begin(), vc.end(), x)  //binary_search???true, false?????????
vector<int>::iterator lit = lower_bound(vc.begin(), vc.end(), x);
  lower_bound?????????????????????"??\???"????????????????????????????????????????????¬???????????????
vector<int>::iterator uit = upper_bound(vc.begin(), vc.end(), x);
  upper_bound????????????????????????"?¶???????"?????????????????????????????????????????¬???????????????
*/
#include <iostream>
#include <cstdio>
#include <climits>
#include <cmath>
#include <cassert>
#include <algorithm>
#include <valarray>
#include <utility>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <map>
#include <set>

#define MAX 100
#define INF 1<<20
#define LLINF 10e12 // 1<<31 // 2^31
#define REP(i,n) for(int i=0;i<n;i++)
#define REP2(i,a,n) for(int i=(a);i<(n);i++)
#define SET(a,c) memset(a,c,sizeof a)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define FOREACH(i,c) for(auto (i) : (c))
#define BIT(i,j) ((i)>>(j))&1
#define ALL(o) (o).begin(), (o).end()
#define ERASE(o) (o).erase(unique(ALL((o))), (o).end());

using namespace std;
typedef long long ll;
typedef valarray<int> array_t;
/////
string key[3] =
{
  "the",
  "this",
  "that"
};
/////
int caeser(string S)
{
  int n = S.length();
  REP(i,26)
  {
    string tmp;
    REP(j,n)
    {
      if(S[j] == '.') continue;
      tmp += ((S[j]-'a'+i)%26)+'a';
    }
    REP(k,3) if(tmp == key[k]) return i;
  }
  return -1;
}

void decode(string &S,int t)
{
  if(t < 0) return;
  int n = S.length();
  REP(i,n)
  {
    if(S[i] == '.') continue;
    S[i] = ((S[i]-'a'+t)%26)+'a';
  }
}

int main()
{
  cin.tie(0);
  ios::sync_with_stdio(false);
  // FROM HERE
  int t, n;
  string S;
  vector<string> data;
  while(cin >> S) data.push_back(S);
  n = data.size();
  REP(i,n) if((t=caeser(data[i]))!=-1) break;
  REP(i,n) decode(data[i],t);
  REP(i,n)
  {
    printf("%s",data[i].c_str());
    printf("%s",(i!=n-1)?" ":"\n");
  }
  return 0;
}

C++: #include <cstdio>
#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str;
	
	while (getline(std::cin, str), !str.empty()){
		int j = 0;
		int di = 0;
		for (int i = 0; i < str.size(); i++){
			if (str[i] == ' '){
				if (i - j < 5 && i - j > 1){
					if (str[j] - str[j + 1] == 12){
						if (str[j + 1] - str[j + 2] == 3){
							di = str[j] - 't';
							break;
						}
						else if (str[j + 1] - str[j + 2] == -1){
							if (str[j + 2] - str[j + 3] == -10){
								di = str[j] - 't';
								break;
							}
						}
						else if (str[j + 1] - str[j + 2] == 7){
							if (str[j + 2] - str[j + 3] == -19){
								di = str[j] - 't';
								break;
							}
						}
					}
					
				j = i + 1;
				}
			}
		}
		
		for (int i = 0; i < str.size();i++){
			if ('a' <= str[i] && str[i] <= 'z' || 'A' <= str[i] && str[i] <= 'Z'){		
				str[i] = str[i] - di;
			}
		}
		
		cout << str << endl;
	}
}

C++: //解けていない





//include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>

using namespace std;

//conversion
//------------------------------------------
inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

//math
//-------------------------------------------
template<class T> inline T sqr(T x) {return x*x;}

//typedef
//------------------------------------------
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;

//container util
//------------------------------------------
#define ALL(a)  (a).begin(),(a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())
#define EACH(i,c) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); ++i)
#define EXIST(s,e) ((s).find(e)!=(s).end())
#define SORT(c) sort((c).begin(),(c).end())

//repetition
//------------------------------------------
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

//constant
//--------------------------------------------
const double EPS = 1e-10;
const double PI  = acos(-1.0);

//clear memory
#define CLR(a) memset((a), 0 ,sizeof(a))

//debug
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

int main() {
  int n;
  string str;
  
  getline(cin, str);

  for(int i = 0; i < str.size(); i++) {
    for(int j = 0; str[i]+j <= 'z'; j++) {
      if(str[i] + j == 't' && str[i] + j+1 == 'h') {
	n = j;
	break;
      }
    } 
    for(int j = 0; str[i]-j >= 'a'; j++) {
      if(str[i] - j == 't' && str[i] - j+1 == 'h') {
	n = j;
	break;
      }
    }
  }
  
  for(int i = 0; i < str.size(); i++) {
    if(str[i] == ' ' || str[i] == '.') printf("%c", str[i]);
    else printf("%c", str[i]+n);
  }
  cout << endl;
}