#include <bits/stdc++.h>
using namespace std;
/*{{{*/  //template
#define rep(i,n) for(int i=0;i<(int)(n);i++)
constexpr int INF = numeric_limits<int>::max()/2;
constexpr long long LINF = numeric_limits<long long>::max()/3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr<<#x<<":"<<x<<endl
#define debug2(x,y) cerr<<#x<<","<<#y":"<<x<<","<<y<<endl
//struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double{ double d; explicit Double(double x) : d(x){} };
ostream& operator<<(ostream& os,const Double x){ os << fixed << setprecision(20) << x.d; return os; }
template<typename T> ostream& operator<<(ostream& os,const vector<T>& vec){ os << "["; for(const auto& v : vec){ os << v << ","; } os << "]"; return os; }
template<typename T,typename U> ostream& operator<<(ostream& os,const pair<T,U>& p){ os << "(" << p.first << ","<< p.second <<")"; return os; }
template<typename T> ostream& operator<<(ostream& os,const set<T>& st){ os<<"{"; for(T v:st) os<<v<<","; os <<"}"; return os; }
template<typename T,typename U> inline void chmax(T &x,U y){ if(y>x) x = y; }
template<typename T,typename U> inline void chmin(T &x,U y){ if(y<x) x = y; }
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a,ll b){ if(b==0) return a; else return gcd(b,a%b); }
//constexpr double eps = 1e-14; 
constexpr double eps = 1e-10; 
constexpr ll mod = 1e9+7;
const int dx[]={1,0,-1,0} ,dy[] = {0,1,0,-1};
/*}}}*/

class Node{
    public:
        int n;
        Node *l,*r;
        Node(){}
        Node(int n) : n(n){}
};


Node* parse(const string& str,int s,int e){
    if(s+1 == e){
        assert(str[s]=='(' and str[e]==')');
        Node* ret = new Node(-1);
        return ret;
    }

    int t=s+1;
    int cnt = 0;
    while(t<e){
        if(str[t]=='(') cnt++;
        else if(str[t]==')') cnt--;
        t++;
        if(cnt==0) break;
    }
    assert(str[t]=='[');
    Node* left = parse(str,s+1,t-1); 
    int num = 0;
    t++;
    while(str[t]!=']'){
        num = num * 10 + str[t]-'0';
        t++;
    }
    assert(str[t]==']');
    Node* right = parse(str,t+1,e-1);
    Node* node = new Node(num);
    node->l = left;
    node->r = right;
    return node;
}

Node* merge(Node *node1, Node *node2){
    if(node1->n==-1 or node2->n==-1){
        return new Node(-1);
    }

    Node *ret = new Node(node1->n + node2->n);
    ret->l = merge(node1->l,node2->l);
    ret->r = merge(node1->r,node2->r);
    return ret;
}

void PrintNode(Node* node,int depth=0){
    string d="";
    rep(i,depth) d+=" ";
    if(node->n == -1){
        cout << d << "Null" << endl;
        return;
    }
    PrintNode(node->l,depth+1);
    cout << d << node->n << endl;
    PrintNode(node->r,depth+1);
}

string decode(Node* node){
    if(node->n == -1) return "()";
    string ret="(";
    ret += decode(node->l);
    ret += "[" + to_string(node->n) + "]";
    ret += decode(node->r);
    ret += ")";
    return ret;
}

int main(){
    string s[2];
    rep(i,2) cin >> s[i];
    rep(i,2){
        s[i] = "(" + s[i] + ")";
    }

    Node* tree[2];
    rep(i,2) tree[i] = parse(s[i],0,s[i].size()-1);

    Node* res = merge(tree[0],tree[1]);
    string ans = decode(res);
    ans = ans.substr(1,ans.size()-2);
    cout << ans << endl;
}



Measured memory_bytes: 3300