#include <bits/stdc++.h>   using namespace std;   template <class TH>   void _dbg(const char *sdbg, TH h) {     cerr << sdbg <<   =   << h << endl;   }   template <class TH, class... TA>   void _dbg(const char *sdbg, TH h, TA... a) {     while (*sdbg !=  , ) cerr << *sdbg++;     cerr <<   =   << h <<  ,  ;     _dbg(sdbg + 1, a...);   }   const int maxn = (1e6) + 7;   const int maxk = 20;   const int inf = (1e9) + 7;   const long long LLinf = (1e18) + 7;   const long double eps = 1e-9;   const long long mod = 1e9 + 7;   struct lit {     bool stan = 0;     int dlu = 1;     lit() {}     lit(int a, int b) {       stan = a;       dlu = b;     }   };   lit merge(lit a, lit b) {     assert(a.stan == b.stan);     return lit(a.stan, a.dlu + b.dlu);   }   vector<lit> a, b, A, B;   vector<pair<int, int> > odp;   void normuj(vector<lit> &a) {     vector<lit> b;     for (int i = 0; i < ((int)(a).size()); i++)       if (((int)(b).size()) > 0 && b.back().stan == a[i].stan)         b.back() = merge(b.back(), a[i]);       else         b.push_back(a[i]);     a = b;   }   vector<pair<int, int> > elo() {     odp.clear();     int ile = 0;     bool f = 0;     ile = ((int)(a).size()) + ((int)(b).size());     if ((((int)(a).size()) > 2 || ((int)(b).size()) > 2) &&         abs(((int)(a).size()) - ((int)(b).size())) > 2) {       if (((int)(a).size()) < ((int)(b).size())) f = 1, swap(a, b);       int le = ile / 2 - 1;       while (le + 1 < ((int)(a).size()) && a[le].stan == b.back().stan &&              a.back().stan != b.back().stan)         le++;       if (a.back().stan == b.back().stan) {         le = ile / 2 - 1;         while (le + 1 < ((int)(a).size()) && a[le].stan != b.back().stan) le++;       }       int cnt = 0;       vector<lit> xd, xd2;       for (int i = 0; i < le; i++) xd.push_back(a[i]);       for (int i = 0; i < ((int)(b).size()) - 1; i++) xd2.push_back(b[i]);       if (a.back().stan == b.back().stan) xd2.push_back(b.back());       int dlu = 0;       for (int i = le; i < ((int)(a).size()); i++)         xd2.push_back(a[i]), dlu += a[i].dlu;       if (a.back().stan != b.back().stan)         odp.push_back({dlu, b.back().dlu}), xd.push_back(b.back());       else         odp.push_back({dlu, 0});       b = xd2;       a = xd;       normuj(a);       normuj(b);     };     while (((int)(a).size()) > 1 && ((int)(b).size()) > 1) {       if (((int)(a).size()) == 2 && ((int)(b).size()) == 2) {         if (a.back().stan == b.back().stan) {           odp.push_back({a.back().dlu, 0});           odp.push_back({a[0].dlu, a.back().dlu + b.back().dlu});         } else           odp.push_back({a.back().dlu, b.back().dlu});         if (f)           for (auto &s : odp) swap(s.first, s.second);         return odp;       }       if (a.back().stan == b.back().stan) {         if (((int)(a).size()) >= ((int)(b).size())) {           pair<lit, lit> xd = {a[((int)(a).size()) - 2], a.back()};           odp.push_back({xd.first.dlu + xd.second.dlu, b.back().dlu});           a.pop_back();           a.pop_back();           lit xdxd = b.back();           b.pop_back();           a.back() = merge(a.back(), xdxd);           b.back() = merge(xd.first, b.back());           b.push_back(xd.second);         } else {           pair<lit, lit> xd = {b[((int)(b).size()) - 2], b.back()};           odp.push_back({a.back().dlu, xd.first.dlu + xd.second.dlu});           b.pop_back();           b.pop_back();           lit xdxd = a.back();           a.pop_back();           b.back() = merge(b.back(), xdxd);           a.back() = merge(xd.first, a.back());           a.push_back(xd.second);         }       } else {         odp.push_back({a.back().dlu, b.back().dlu});         lit xd = a.back();         lit xd2 = b.back();         a.pop_back();         b.pop_back();         b.back() = merge(b.back(), xd);         a.back() = merge(a.back(), xd2);       }     };     if (((int)(a).size()) == 3 && ((int)(b).size()) == 1) {       if (a.back().stan == b.back().stan) {         odp.push_back({a.back().dlu, 0});         odp.push_back(             {a[((int)(a).size()) - 2].dlu, a.back().dlu + b.back().dlu});       } else {         odp.push_back({a.back().dlu, b.back().dlu});         odp.push_back(             {a[((int)(a).size()) - 2].dlu + b.back().dlu, a.back().dlu});       }     }     if (((int)(a).size()) == 1 && ((int)(b).size()) == 3) {       if (b.back().stan == a.back().stan) {         odp.push_back({0, b.back().dlu});         odp.push_back(             {b.back().dlu + a.back().dlu, b[((int)(b).size()) - 2].dlu});       } else {         odp.push_back({a.back().dlu, b.back().dlu});         odp.push_back(             {b.back().dlu, b[((int)(b).size()) - 2].dlu + a.back().dlu});       }     }     if (((int)(a).size()) == 2 && ((int)(b).size()) == 1) {       if (a.back().stan == b.back().stan)         odp.push_back({a.back().dlu, 0});       else         odp.push_back({a.back().dlu, b.back().dlu});     }     if (((int)(b).size()) == 2 && ((int)(a).size()) == 1) {       if (a.back().stan == b.back().stan)         odp.push_back({0, b.back().dlu});       else         odp.push_back({a.back().dlu, b.back().dlu});     }     if (f)       for (auto &s : odp) swap(s.first, s.second);     return odp;   }   vector<pair<int, int> > eloelo() {     bool f = 0;     int ile = 0;     odp.clear();     ile = ((int)(a).size()) + ((int)(b).size());     if ((((int)(a).size()) > 2 || ((int)(b).size()) > 2) &&         abs(((int)(a).size()) - ((int)(b).size())) > 2) {       if (((int)(a).size()) < ((int)(b).size())) f = 1, swap(a, b);       int le = ile / 2 - 1;       while (le + 1 < ((int)(a).size()) && a[le].stan == b.back().stan) le++;       int cnt = 0;       vector<lit> xd, xd2;       for (int i = 0; i < le; i++) xd.push_back(a[i]);       for (int i = 0; i < ((int)(b).size()) - 1; i++) xd2.push_back(b[i]);       int dlu = 0;       for (int i = le; i < ((int)(a).size()); i++)         xd2.push_back(a[i]), dlu += a[i].dlu;       odp.push_back({dlu, b.back().dlu});       xd.push_back(b.back());       b = xd2;       a = xd;       normuj(a);       normuj(b);     }     while (((int)(a).size()) > 1 && ((int)(b).size()) > 1) {       if (((int)(a).size()) == 2 && ((int)(b).size()) == 2) {         if (a.back().stan == b.back().stan) {           odp.push_back({a.back().dlu, 0});           odp.push_back({a[0].dlu, a.back().dlu + b.back().dlu});         } else           odp.push_back({a.back().dlu, b.back().dlu});         if (f)           for (auto &s : odp) swap(s.first, s.second);         return odp;       }       if (a.back().stan == b.back().stan) {         if (((int)(a).size()) >= ((int)(b).size())) {           pair<lit, lit> xd = {a[((int)(a).size()) - 2], a.back()};           odp.push_back({xd.first.dlu + xd.second.dlu, b.back().dlu});           a.pop_back();           a.pop_back();           lit xdxd = b.back();           b.pop_back();           a.back() = merge(a.back(), xdxd);           b.back() = merge(xd.first, b.back());           b.push_back(xd.second);         } else {           pair<lit, lit> xd = {b[((int)(b).size()) - 2], b.back()};           odp.push_back({a.back().dlu, xd.first.dlu + xd.second.dlu});           b.pop_back();           b.pop_back();           lit xdxd = a.back();           a.pop_back();           b.back() = merge(b.back(), xdxd);           a.back() = merge(xd.first, a.back());           a.push_back(xd.second);         }       } else {         odp.push_back({a.back().dlu, b.back().dlu});         lit xd = a.back();         lit xd2 = b.back();         a.pop_back();         b.pop_back();         b.back() = merge(b.back(), xd);         a.back() = merge(a.back(), xd2);       }     };     if (((int)(a).size()) == 3 && ((int)(b).size()) == 1) {       if (a.back().stan == b.back().stan) {         odp.push_back({a.back().dlu, 0});         odp.push_back(             {a[((int)(a).size()) - 2].dlu, a.back().dlu + b.back().dlu});       } else {         odp.push_back({a.back().dlu, b.back().dlu});         odp.push_back(             {a[((int)(a).size()) - 2].dlu + b.back().dlu, a.back().dlu});       }     }     if (((int)(a).size()) == 1 && ((int)(b).size()) == 3) {       if (b.back().stan == a.back().stan) {         odp.push_back({0, b.back().dlu});         odp.push_back(             {b.back().dlu + a.back().dlu, b[((int)(b).size()) - 2].dlu});       } else {         odp.push_back({a.back().dlu, b.back().dlu});         odp.push_back(             {b.back().dlu, b[((int)(b).size()) - 2].dlu + a.back().dlu});       }     }     if (((int)(a).size()) == 2 && ((int)(b).size()) == 1) {       if (a.back().stan == b.back().stan)         odp.push_back({a.back().dlu, 0});       else         odp.push_back({a.back().dlu, b.back().dlu});     }     if (((int)(b).size()) == 2 && ((int)(a).size()) == 1) {       if (a.back().stan == b.back().stan)         odp.push_back({0, b.back().dlu});       else         odp.push_back({a.back().dlu, b.back().dlu});     }     if (f)       for (auto &s : odp) swap(s.first, s.second);     return odp;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     string s;     cin >> s;     char poprz = 0;     int ile = 0;     for (auto v : s) {       if (v == poprz)         ile++;       else {         if (ile > 0) a.push_back(lit(poprz -  a , ile));         poprz = v;         ile = 1;       }     }     a.push_back(lit(poprz -  a , ile));     cin >> s;     ile = 0;     poprz =  a ;     for (auto v : s) {       if (v == poprz)         ile++;       else {         if (ile > 0) b.push_back(lit(poprz -  a , ile));         poprz = v;         ile = 1;       }     }     b.push_back(lit(poprz -  a , ile));     reverse(a.begin(), a.end());     reverse(b.begin(), b.end());     A = a;     B = b;     vector<pair<int, int> > x = elo();     a = A;     b = B;     vector<pair<int, int> > y = eloelo();     cout << min(((int)(x).size()), ((int)(y).size())) <<   n ;     if (((int)(x).size()) < ((int)(y).size()))       for (auto s : x) cout << s.first <<     << s.second <<   n ;     else       for (auto s : y) cout << s.first <<     << s.second <<   n ;     return 0;   }