#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<cmath>
#define LL long long
using namespace std;
const int N=105;
char s[N];
int mm[N][N];//l到r所需最少匹配
bool add[N];//是否需要匹配
int dp(int l,int r)
{
if(l>r)
return 0;
if(mm[l][r]!=-1)
return mm[l][r];
if(l==r)//只有一個括號 必須匹配
{
mm[l][r]=1;
return mm[l][r];
}
if(l<r)//找最優(yōu)
{
mm[l][r]=N;
if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
{
mm[l][r]=dp(l+1,r-1);
}
for(int i=l;i<r;++i)
{
mm[l][r]=min(mm[l][r],dp(l,i)+dp(i+1,r));
}
return mm[l][r];
}
return mm[l][r];
}
void findadd(int l,int r)//找符合條件的最優(yōu)向下遞歸 找需要匹配的括號
{
if(l>r)
return ;
if(l==r)
add[l]=true;
if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
{
if((l>r&&mm[l][r]==0)||mm[l][r]==mm[l+1][r-1])
{
findadd(l+1,r-1);
return;
}
}
for(int i=l;i<r;++i)
{
if(mm[l][i]+mm[i+1][r]==mm[l][r])
{
findadd(l,i);
findadd(i+1,r);
return ;
}
}
}
int main()
{
while(gets(s))
{
int n=strlen(s);
memset(mm,-1,sizeof(mm));
memset(add,false,sizeof(add));
dp(0,n-1);
findadd(0,n-1);
for(int i=0;i<n;++i)
{
if(add[i])
{
if(s[i]=='(')
printf("%c)",s[i]);
if(s[i]==')')
printf("(%c",s[i]);
if(s[i]=='[')
printf("%c]",s[i]);
if(s[i]==']')
printf("[%c",s[i]);
continue;
}
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}