#include <algorithm>
#include <cmath>
#include<cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define REP(i,n) for ( int i = 0; i < (n); i++)
#define FOR(i,a,b) for ( int i = (a); i <= (b); i++ )
#define FORD(i,a,b) for ( int i = (a); i>= (b); i-- )
#define DEBUG(x) cerr << ">>> " << #x << " : " << x << endl;
const string morseTable [30]= {".-","-...","-.-.","-..",".","..-.","--.","....",
"..",".---","-.-",".-..","--","-.","---",".--.",
"--.-",".-.","...","-","..-","...-",".--","-..-","-.--",
"--..","..--",".-.-","---.","----"};
char find (string s) {
int res = -1;
for (int i = 0; i < 30; i++){
if (s == morseTable[i]) {
res = i;
break;
}
}
if (res < 26 ) return (char)(res+'A');
else if (res == 26) return '_';
else if (res == 27) return ',';
else if (res == 28) return '.';
else return '?';
}
int main() {
string s,morse,result,tmpres;
int lengths [1010],prev;
while (cin >> s) {
//cout << s << endl;
tmpres = result = morse = "";
for (int i = 0; i < (int)s.length(); i++) {
if (s[i]>='A' && s[i]<='Z') morse += morseTable [s[i]-'A'];
else if (s[i]=='_') morse += morseTable [26];
else if (s[i]==',') morse += morseTable [27];
else if (s[i]=='.') morse += morseTable [28];
else if (s[i]=='?') morse += morseTable [29];
if (s[i]>='A' && s[i]<='Z') lengths[i]=morseTable[s[i]-'A'].length();
else lengths[i]=4;
}
//cout << morse << endl;
//for (int i = 0; i < (int)s.length(); i++) {
// cout << lengths [i];
//}
//cout << endl;
prev = 0;
for (int i = 0; i < (int)s.length(); i++) {
tmpres += morse.substr (prev,lengths[(int)s.length()-i-1]);
result += find(morse.substr (prev,lengths[(int)s.length()-i-1]));
tmpres += '|';
prev += lengths[(int)s.length()-i-1];
}
cout << result << endl;
//cout << tmpres << endl;
}
return 0;
}