Go: package main

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

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	for scanner.Scan() {
		var result string
		line := scanner.Text()
		key := make(map[string]string)

		var i int32
		for ; i < 52; i++ {
			makeKey(key, i)
			result = decode(key, line)

			if strings.Contains(result, "the") {
				break
			} else if strings.Contains(result, "this") {
				break
			} else if strings.Contains(result, "that") {
				break
			}
		}

		fmt.Println(result)
	}
}

func makeKey(key map[string]string, shift int32) {
	for i := 'a'; i <= 'z'; i++ {
		cipher := (i + shift)
		if cipher > 'z' {
			cipher = cipher%'z' + 'a' - 1
		} else if cipher < 'a' {
			cipher = cipher + ('z' - 'a') + 1
		}
		key[string(i)] = string(cipher)
	}
}

func decode(key map[string]string, cipher string) string {
	var result string
	for _, v := range cipher {
		if key[string(v)] != "" {
			result += key[string(v)]
		} else {
			result += string(v)
		}
	}
	return result
}

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

using namespace std;

int main()
{
    string s;

    while (getline(cin, s)) {
        while (s.find("the") == s.npos &&
                    s.find("this") == s.npos &&
                    s.find("that") == s.npos) {
            for (int i = 0; i < s.size(); i++) {
                if (s[i] >= 'a' || 'y' >= s[i]) {
                    s[i]++;
                } else {
                    s[i] = 'a';
                }
            }
        }
        cout << s << endl;
    }

    return 0;
}

C++: # include <iostream>
# include <algorithm>
# include <vector>
# include <string>
# include <set>
# include <map>
# include <cmath>
# include <iomanip>
# include <functional>
# include <utility>
# include <stack>
# include <queue>
# include <list>
# include <bitset>
# include <complex>
# include <numeric>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
constexpr long long MOD = 1000000000 + 7;
constexpr int INF = 2000000000;
constexpr int HINF = INF / 2;
constexpr double DINF = 100000000000000000.0;
constexpr long long LINF = 9223372036854775807;
constexpr long long HLINF = 4500000000000000000;
const double PI = acos(-1);

int main() {
	string s;
	while (getline(cin, s)) {
		bool update = true;
		while (update) {
			for (int i = 0; i < s.size(); i++) {
				if (s.substr(i, 3) == "the") {
					cout << s << endl;
					update = false;
					break;
				}
				if (s.substr(i, 4) == "this") {
					cout << s << endl;
					update = false;
					break;
				}
				if (s.substr(i, 4) == "that") {
					cout << s << endl;
					update = false;
					break;
				}
			}
			for (int i = 0; i < s.size(); i++) {
				if (!('a' <= s[i] && s[i] <= 'z')) {
					continue;
				}
				if (s[i] == 'z')s[i] = 'a';
				else s[i] = char(s[i] + 1);
			}
			//cout << s << endl;
		}
	}
}

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

using namespace std;

void solve()
{
	string s;
	while(getline(cin, s))
	{
		for(int i = 0; i < 26; ++i)
		{
			for(int j = 0; j < s.size(); ++j)
			{
				if('a' <= s[j] && s[j] <= 'z')
				{
					if(s[j] == 'z')
					{
						s[j] = 'a';
					}
					else
					{
						++s[j];
					}
				}
			}
			if(s.find("this") != string::npos || s.find("that") != string::npos || s.find("the") != string::npos)
			{
				cout << s << endl;
				break;
			}
		}
	}
}

int main()
{
	solve();
	return(0);
}

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

using namespace std;

string thi[100],tha[100],the[100];

string change_str(string ch,int mov);
int set(void);

int main()
{
	int i,j;
	char ch[100];
	
	set();
	for(;cin.getline(ch,81);)
	{
		for(i=0;i<27;i++)
		{
			int se;
			se=string(ch).find(thi[i],0);
			if(se!=string::npos)
				break;
			se=string(ch).find(tha[i],0);
			if(se!=string::npos)
				break;
			se=string(ch).find(the[i],0);
			if(se!=string::npos)
				break;
		}
		
		string ans;
		
		ans=change_str(string(ch),26-i);
		
		cout << ans << endl;
		
		string(ch)="";
	}
}

int set(void)
{
	int i,j;
	thi[0]="this";
	tha[0]="that";
	the[0]="the";
	
	for(i=1;i<27;i++)
	{
		int a,b,c;
		thi[0]=change_str(thi[0],1);
		tha[0]=change_str(tha[0],1);
		the[0]=change_str(the[0],1);
		
		thi[i]=thi[0];
		tha[i]=tha[0];
		the[i]=the[0];
	}
	return 0;
}

string change_str(string change,int mov)
{
	for(int i=0;i<mov;i++)
	{
		for(int j=0;j<change.size();j++)
		{
			int a;
			a=int(change[j]);
			if(a>95 && a<123)
			{
				change[j]++;
				if(a==122)
					change[j]-=26;
			}
		}
	}
	return change;
}

C++: /*
C++ ???????????????????????????????????¬??????
??????AOJ-ITP1??????????????????
*/
#define _USE_MATH_DEFINES

#include <iostream> // ?¨??????\??????
#include <fstream>  // ??????????????\??????
#include <string>   // ???????????¢???
#include <vector>   // ???????????????
#include <cmath>    // ??°??????
#include <iomanip>  // stream???????????¢???
#include <algorithm>// max??¢??°??????

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;        // ????´???°????????????????????????
using std::fixed;         // ???????????????????¨???????????????????????????????
using std::setprecision;  // ?????°????°???°?????\???????????°????????????????????¨????????\???

int main() {
	string str;		// ????????????????????????????´???????
	string trans;	// ????????????????????????????´???????
	
	while (std::getline(cin, str))
	{
		trans.clear();
		trans.resize(80);
		// n?????????????????????????????§7????????????
		for (int i = -7;; i++)
		{
			for (size_t j = 0; j < str.size(); j++)
			{
				// ???????????????????????????????????????
				if (str[j] == ' ' || str[j] == '.')
				{
					trans[j] = str[j];
				}
				else
				{
					trans[j] = str[j] + i;
				}
			}
			// ?????????????????????find??¢??°???????????¨??????
			// ???????????£??????????¨??????????????????£????????????????????????
			if (!trans.find("this") || !trans.find("the") || !trans.find("that"))
			{
				cout << trans << endl;
				break;
			}
		}

	}
	return 0;
}

C++: #include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	getline(cin, s);
	int n = s.size();
	for (int i = 0; i < 26; i++) {
		bool flag = false;
		for (int j = 0; j + 3 < n; j++) {
			if (s.substr(j, 3) == "the" && (j == 0 || s[j - 1] < 'a' || s[j - 1] > 'z') && (s[j + 3] < 'a' || s[j + 3] > 'z')) {
				flag = true;
			}
		}
		for (int j = 0; j + 4 < n; j++) {
			if (s.substr(j, 4) == "this" && (j == 0 || s[j - 1] < 'a' || s[j - 1] > 'z') && (s[j + 4] < 'a' || s[j + 4] > 'z')) {
				flag = true;
			}
		}
		for (int j = 0; j + 4 < n; j++) {
			if (s.substr(j, 4) == "that" && (j == 0 || s[j - 1] < 'a' || s[j - 1] > 'z') && (s[j + 4] < 'a' || s[j + 4] > 'z')) {
				flag = true;
			}
		}
		if (flag) {
			cout << s << endl;
			break;
		}
		for (int j = 0; j < n; j++) {
			if (s[j] >= 'a' && s[j] <= 'z') {
				s[j] = s[j] == 'z' ? 'a' : s[j] + 1;
			}
		}
	}
	return 0;
}

C++: #include<bits/stdc++.h>
#define REP(i,n) for(int i=0;i<n;i++)
#define LOOP(i,x,n) for(int i=x;i<n;i++)
#define ALL(v) (v).begin(),(v).end()
#define PB push_back
#define MP make_pair
#define FR first
#define SC second
#define int long long
using namespace std;
const int MOD=1000000007;
const int INF=9000000009;

signed main(){
  string s;
  while(getline(cin,s)){
    vector<int> spe;
    REP(i,s.size())if(s[i]==' ')spe.PB(i);
    int f=0;
    LOOP(i,1,27){
      string t;
      REP(j,s.size()-1){
        if(s[j]==' ')continue;
        if((s[j]+i)<=122){
          t+=(s[j]+i);
        }else{
          t+=((s[j]+i)-26);
        }
      }
      REP(j,t.size()){
        if(t.substr(j,3)=="the"||t.substr(j,4)=="that"||t.substr(j,4)=="this"){
          int p=0;
          REP(k,t.size()){
            if(k==spe[p]-p-1){
              cout<<t[k]<<" ";
              p++;
            }else{
              cout<<t[k];
            }
          }
          cout<<"."<<endl;
          f=1;
          break;
        }
      }
      if(f)break;
    }
  }
  return 0;
}