//#include <bits/stdc++.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <time.h>
using namespace std;
long double esp=1e-11;
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define cle(a) while(!a.empty())a.pop()
#define mem(p) memset(p,0,sizeof(p))
#define memf(p) memset(p,0x3f,sizeof(p))
#define memn(p) memset(p,-1,sizeof(p))
#define mp(A, B) make_pair(A, B)
#define pb push_back
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
typedef long long int LL;
const long double PI = acos((long double)-1);
const LL INF=0x3f3f3f3f3f3f3f3fll;
const int MOD = 1000000007;
const int maxn=110000;
pair<char,int> S[maxn],quS[maxn];     //quS主串
int len,len1;
int nx[maxn];
int kmp_next()      //nx数?表示匹配失配后模式串跳?位置ababc-10-102
{
    int len,i=0,j=nx[0]=-1;
    while(i<len)
    {
        while(j!=-1&&S[i]!=S[j])j=nx[j];
        i++;j++;
        nx[i]=(S[i]==S[j])?nx[j]:j;
        //nx[i]=j; 		前i-1最大前?后? whlielen+1
    }
    return len;
}
vector<pair<char,int> >q[3],ans,ans1;
void pr()
{
    int l=ans.size(),l1=-1;
    ans1.clear();
    for(int x=0;x<l;x++)
    {                   //printf("%c %d ",ans[x].fi,ans[x].se);
        if(l1>=0&&ans[x].fi==ans1[l1].fi)
        {
            ans1[l1].se+=ans[x].se;
            continue;
        }
        ans1.pb(ans[x]);
        l1++;
    }
    l=ans1.size();
    for(int x=0;x<l;x++)
        printf("%c %d ",ans1[x].fi,ans1[x].se);
    printf("$\n");
}
void kmp()
{
    int i=0,j=0;
    int n=len,m=len1;
    int sl=q[1].size();
    while(i<n)
    {
        while(j!=-1&&quS[i]!=S[j])j=nx[j];
        i++;j++;
        if(j>=m)
        {
            //ans++;		//i在主串匹配的字串的后1位
            if(i<len&&quS[i].fi==q[1][sl-1].fi&&quS[i].se>=q[1][sl-1].se&&
               i-m-1>=0&&quS[i-m-1].fi==q[1][0].fi&&quS[i-m-1].se>=q[1][0].se)
            {
                ans.clear();
                for(int x=0;x<=i-m-2;x++)
                    ans.pb(q[0][x]);
                if(quS[i-m-1].se>q[1][0].se)
                    ans.pb(mp(quS[i-m-1].fi,quS[i-m-1].se-q[1][0].se));
                int tem=q[2].size();
                for(int x=0;x<tem;x++)
                    ans.pb(q[2][x]);
                if(quS[i].se>q[1][sl-1].se)
                    ans.pb(mp(quS[i].fi,quS[i].se-q[1][sl-1].se));
                for(int x=i+1;x<len;x++)
                    ans.pb(q[0][x]);
                pr();
                return ;
            }
            j=nx[j];
        }
    }
    for(int x=0;x<len;x++)
        ans.pb(q[0][x]);
    pr();
    return;
}
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("inlay.in", "r", stdin);
    //freopen("out.txt", "w", stdout);
    //map<long long int,int>ma;                 %I64d
    //vector<int>::iterator iter;
    //memset(m,0,sizeof(int));
    //for(int x=1;x<=n;x++)
    //for(int y=1;y<=n;y++)
    //scanf("%d%d",&a,&b);
    //scanf("%d",&a);
    //printf("%d\n",ans);
    q[0].clear();
    q[1].clear();
    q[2].clear();
    ans.clear();
    char s[10],f=0;
    int t;
    while(f<3)
    {
        scanf("%s",s);
        if(s[0]=='$'){f++;continue;}
        scanf("%d",&t);
        q[f].pb(mp((char)s[0],t));
    }
    len=q[0].size();
    if(q[1].size()==1)
    {
        ans.clear();
        for(int x=0;x<len;x++)
        {
            if(q[0][x].fi==q[1][0].fi&&q[1][0].se<=q[0][x].se)
            {
                int len2=q[2].size();
                for(int y=0;y<len2;y++)
                    ans.pb(q[2][y]);
                if(q[1][0].se<q[0][x].se)
                    ans.pb(mp(q[0][x].fi,q[0][x].se-q[1][0].se));
                for(int y=x+1;y<len;y++)
                    ans.pb(q[0][y]);
                break;
            }
            else
                ans.pb(q[0][x]);
        }
        pr();
        return 0;
    }
    if(q[1].size()==2)
    {
        ans.clear();
        for(int x=0;x<len;x++)
        {
            if(x<len-1&&q[0][x].fi==q[1][0].fi&&q[1][0].se<=q[0][x].se&&q[0][x+1].fi==q[1][1].fi&&q[1][1].se<=q[0][x+1].se)
            {
                int len2=q[2].size();
                if(q[1][0].se<q[0][x].se)
                    ans.pb(mp(q[0][x].fi,q[0][x].se-q[1][0].se));
                for(int y=0;y<len2;y++)
                    ans.pb(q[2][y]);
                if(q[1][1].se<q[0][x+1].se)
                    ans.pb(mp(q[0][x+1].fi,q[0][x+1].se-q[1][1].se));
                for(int y=x+2;y<len;y++)
                    ans.pb(q[0][y]);
                break;
            }
            else
                ans.pb(q[0][x]);
        }
        pr();
        return 0;
    }
    len1=q[1].size()-2;
    for(int x=1;x<len-1;x++)
        S[x-1]=q[1][x];
    for(int x=0;x<len;x++)
        quS[x]=q[0][x];
    kmp_next();
    kmp();

    return 0;
}

Measured memory_bytes: 3256