#include<bits/stdc++.h>
using namespace std;
const long long N=160;
bool check(string s)
{
if(s.size()==1) return false;
if(s[0]<'A'||s[0]>'Z') return false;
for(long long i=1;i<s.size();i++) if(s[i]<'a'||s[i]>'z') return false;
return true;
}
bool is(char s)
{
if(s<='Z'&&s>='A') return true;
if(s<='z'&&s>='a') return true;
return false;
}
struct node
{
string word;
bool cap;
long long start,end;
}w[N];
int main(){
string s;
while(getline(cin,s))
{
if(s.size()==0) break;
long long st=0;
long long num=0;
for(long long i=0;i<s.size();i++){
if(i==0) st=0;
else if(is(s[i])&&(!is(s[i-1]))) st=i;
if(is(s[i])){
w[num].word.push_back(s[i]);
if((i+1==s.size())||(!is(s[i+1]))){
w[num].start=st;
w[num].end=i;
num++;
}
}
}
string tmp1;tmp1.clear();
string tmp2;tmp2.clear();
string ans;ans.clear();
long long len=0;st=0;
long long stat=0;
for(long long i=0;i<w[0].start;i++){
ans.push_back(s[i]);
}
for(long long i=0;i<num;i++){
if(stat==0){
if(check(w[i].word)&&check(w[i+1].word)&&(w[i+1].start-w[i].end==2)&&(s[w[i].end+1]==' ')){
if(i!=0) for(long long j=w[i-1].end+1;j<w[i].start;j++) ans.push_back(s[j]);
stat=1;
tmp1.push_back(w[i].word[0]),tmp2+=w[i].word,tmp2.push_back(' ');
}
else{
for(long long j=w[i-1].end+1;j<w[i].start;j++) ans.push_back(s[j]);
ans+=w[i].word;
}
}
else if(stat==1){
if(!(check(w[i].word)&&check(w[i+1].word)&&(w[i+1].start-w[i].end==2)&&(s[w[i].end+1]==' '))){
stat=0;
tmp1.push_back(w[i].word[0]),tmp2+=w[i].word,tmp2.push_back(')');
ans+=tmp1;
ans.push_back(' '),ans.push_back('(');
ans+=tmp2;
tmp1.clear(),tmp2.clear();
}
else{
tmp1.push_back(w[i].word[0]),tmp2+=w[i].word,tmp2.push_back(' ');
}
}
}
for(long long i=w[num-1].end+1;i<s.size();i++) ans.push_back(s[i]);
cout<<ans<<endl;
for(long long i=0;i<=num;i++){
w[i].word.clear();
}
}
}