#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <functional>
#include <string>
#include <iostream>
#include <cctype>
#include <set>
#include <climits>
#include <iomanip>
#include <cassert>

using namespace std;

#define D(x)        cout<<#x " = "<<(x)<<endl
#define un(x)       x.erase(unique(x.begin(),x.end()), x.end())
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pb          push_back
#define pi          2*acos(0.0)
#define mp          make_pair
#define xx          first
#define yy          second
#define hp          (ll) 999983
#define mx          100000
#define mod         1000000007
#define endl        '\n'

typedef long long int ll;

ll F[mx+7];
vector<pair<int, char> > A, B;
void failure_function( char *pattern, ll len ) {
    F[0] = F[1] = 0;
    ll i,j;
    for( i=2; i<=len; i++ ) {
        j = F[i-1];
        while( 1 ) {
            if( pattern[j] == pattern[i-1] ) {
                F[i] = j + 1;
                break;
            }
            if( j==0) {
                F[i] = 0;
                break;
            }
            j = F[j];
        }
    }
}

ll KMP( char *text, ll len_t, char *pattern, ll len_p  ) {
    failure_function( pattern, len_p );
    ll i = 0,j = 0, ret = 0, h, k, m;
    deque<ll> v;
    while( j<len_t ) {
        if( text[j] == pattern[i] ) {
            i++;
            j++;
            v.pb(j - 1);
            if( i == len_p ) {
                if(v.size() == 1) {
                    cout << A[j - 1].first << " " << B[i - 1].first << endl;
                    if(A[j - 1].first >= B[i - 1].first) {
                        ret += A[j - 1].first - B[i - 1].first;
                    }
                    if(A[j - 1].first == B[i - 1].first) {
                        ret ++;
                    }
                } else {
                    m = 0;
                    for(h = 0; h < v.size(); h ++) {
                        k = v[h];
                        if(h == 0 || h == v.size() - 1) {
                            if(A[k].first >= B[k].first) m ++;
                            else break;
                        } else if(A[k].first == B[k].first) m ++;
                        else break;
                        //cout << A[k].first << " " << B[k].first << endl;
                    }
                    if(m == len_p) {
                        ret ++;
                    }
                }
            }
        } else if( i > 0 ) i = F[i], v.clear();
        else {
            j++;
            if(!v.empty()) v.pop_front();
        }
    }
    return ret;
}

int main() {
    int i, j, k, n, m, l, a, b;
    char t[mx + 10], s[mx + 10], ch;
    sff(n, m);
    for(i = 1, j = 0; i <= n; i ++) {
        scanf("%d-%c", &l, &ch);
        if(A.size()) {
            if(A.back().second == ch) {
                A.back().first += l;
                continue;
            }
        }
        A.pb(make_pair(l, ch));
        t[j++] = ch;
    }
    t[j] = '\0';

    for(i = 1, j = 0; i <= m; i ++) {
        scanf("%d-%c", &l, &ch);
        if(B.size()) {
            if(B.back().second == ch) {
                B.back().first += l;
                continue;
            }
        }
        B.pb(make_pair(l, ch));
        s[j++] = ch;
    }
    s[j++] = '\0';
    a = strlen(t), b = strlen(s);
    cout << s << " " << t << endl;
    printf("%d\n", KMP(t, a, s, b));
}
