#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class t, class u>
void chmax(t& first, u second) {
  if (first < second) first = second;
}
template <class t, class u>
void chmin(t& first, u second) {
  if (second < first) first = second;
}
template <class t>
using vc = vector<t>;
template <class t>
using vvc = vc<vc<t>>;
using pi = pair<int, int>;
using vi = vc<int>;
template <class t, class u>
ostream& operator<<(ostream& os, const pair<t, u>& p) {
  return os << "{" << p.first << "," << p.second << "}";
}
template <class t>
ostream& operator<<(ostream& os, const vc<t>& v) {
  os << "{";
  for (auto e : v) os << e << ",";
  return os << "}";
}
using uint = unsigned;
using ull = unsigned long long;
template <class t, size_t n>
ostream& operator<<(ostream& os, const array<t, n>& first) {
  return os << vc<t>(first.begin(), first.end());
}
template <int i, class T>
void print_tuple(ostream&, const T&) {}
template <int i, class T, class H, class... Args>
void print_tuple(ostream& os, const T& t) {
  if (i) os << ",";
  os << get<i>(t);
  print_tuple<i + 1, T, Args...>(os, t);
}
template <class... Args>
ostream& operator<<(ostream& os, const tuple<Args...>& t) {
  os << "{";
  print_tuple<0, tuple<Args...>, Args...>(os, t);
  return os << "}";
}
template <class t>
void print(t x, int suc = 1) {
  cout << x;
  if (suc == 1) cout << "\n";
  if (suc == 2) cout << " ";
}
ll read() {
  ll i;
  cin >> i;
  return i;
}
vi readvi(int n, int off = 0) {
  vi v(n);
  for (int i = int(0); i < int(n); i++) v[i] = read() + off;
  return v;
}
template <class T>
void print(const vector<T>& v, int suc = 1) {
  for (int i = int(0); i < int(v.size()); i++)
    print(v[i], i == int(v.size()) - 1 ? suc : 2);
}
string readString() {
  string s;
  cin >> s;
  return s;
}
template <class T>
T sq(const T& t) {
  return t * t;
}
void yes(bool ex = true) {
  cout << "Yes"
       << "\n";
  if (ex) exit(0);
}
void no(bool ex = true) {
  cout << "No"
       << "\n";
  if (ex) exit(0);
}
void possible(bool ex = true) {
  cout << "Possible"
       << "\n";
  if (ex) exit(0);
}
void impossible(bool ex = true) {
  cout << "Impossible"
       << "\n";
  if (ex) exit(0);
}
constexpr ll ten(int n) { return n == 0 ? 1 : ten(n - 1) * 10; }
const ll infLL = LLONG_MAX / 3;
const int inf = INT_MAX / 2 - 100;
int topbit(signed t) { return t == 0 ? -1 : 31 - __builtin_clz(t); }
int topbit(ll t) { return t == 0 ? -1 : 63 - __builtin_clzll(t); }
int botbit(signed first) { return first == 0 ? 32 : __builtin_ctz(first); }
int botbit(ll first) { return first == 0 ? 64 : __builtin_ctzll(first); }
int popcount(signed t) { return __builtin_popcount(t); }
int popcount(ll t) { return __builtin_popcountll(t); }
bool ispow2(int i) { return i && (i & -i) == i; }
int mask(int i) { return (int(1) << i) - 1; }
bool inc(int first, int second, int c) {
  return first <= second && second <= c;
}
template <class t>
void mkuni(vc<t>& v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
}
ll rand_int(ll l, ll r) {
  static random_device rd;
  static mt19937_64 gen(rd());
  return uniform_int_distribution<ll>(l, r)(gen);
}
template <class t>
int lwb(const vc<t>& v, const t& first) {
  return lower_bound(v.begin(), v.end(), first) - v.begin();
}
vi lens(string s) {
  vi res;
  char pre = 'c';
  for (auto c : s) {
    if (c != pre) {
      res.emplace_back(0);
      pre = c;
    }
    res.back()++;
  }
  return res;
}
void sums(vi& x) {
  for (int i = int(1); i < int(int(x.size())); i++) x[i] += x[i - 1];
}
vi shift(vi x, int off) {
  vi res(int(x.size()) + off);
  for (int i = int(0); i < int(int(x.size())); i++) res[i + off] = x[i];
  return res;
}
pair<int, vc<pi>> sub(vi x, vi y, int off, int k) {
  void(0);
  bool rev = false;
  if (x.size() < y.size()) {
    swap(x, y);
    rev = true;
  }
  if (int(y.size()) == 1 && k) return {inf, {}};
  void(0);
  void(0);
  int dif = x.size() - y.size();
  int mid = dif / 2;
  int cut = mid + off;
  if (cut < 0 || dif < cut) return {inf, {}};
  vc<pi> res;
  void(0);
  void(0);
  if (cut || k) {
    vi z(x.begin(), x.begin() + cut);
    x.erase(x.begin(), x.begin() + cut);
    vi w(y.begin(), y.begin() + k);
    y.erase(y.begin(), y.begin() + k);
    res.emplace_back(accumulate(z.begin(), z.end(), 0),
                     accumulate(w.begin(), w.end(), 0));
    if (int(x.size()) % 2 == int(y.size()) % 2) {
      if (int(z.size())) {
        z.back() += y[0];
        y.erase(y.begin());
      }
      if (int(w.size())) {
        w.back() += x[0];
        x.erase(x.begin());
      }
    }
    y.insert(y.begin(), z.begin(), z.end());
    x.insert(x.begin(), w.begin(), w.end());
  }
  void(0);
  void(0);
  sums(x);
  sums(y);
  int len = max(int(x.size()), int(y.size()));
  x = shift(x, len - int(x.size()));
  y = shift(y, len - int(y.size()));
  for (int i = int(len - 1) - 1; i >= int(0); i--) {
    res.emplace_back(x[i], y[i]);
    if ((len - 2 - i) % 2) swap(res.back().first, res.back().second);
  }
  if (rev)
    for (auto& p : res) swap(p.first, p.second);
  void(0);
  return {res.size(), res};
}
pair<int, vc<pi>> slv(string s, string t, bool rev) {
  s += 'a';
  t += 'b';
  void(0);
  vi x = lens(s), y = lens(t);
  void(0);
  void(0);
  pair<int, vc<pi>> ans(inf, {});
  for (int off = int(-4); off < int(5); off++)
    for (int k = int(0); k < int(2); k++) chmin(ans, sub(x, y, off, k));
  void(0);
  if (rev) {
    for (auto& p : ans.second) swap(p.first, p.second);
  }
  return ans;
}
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout << fixed << setprecision(20);
  string s, t;
  bool dbg = true;
  dbg = false;
  if (!dbg) {
    cin >> s >> t;
  } else {
    int n = 1000;
    for (int i = int(0); i < int(n); i++) s += rand_int('a', 'b');
    for (int i = int(0); i < int(n); i++) t += rand_int('a', 'b');
  }
  pair<int, vc<pi>> ans = min(slv(s, t, false), slv(t, s, true));
  print(ans.first);
  for (auto p : ans.second) {
    print(p.first, 2);
    print(p.second);
    if (dbg) {
      cout << endl;
      string x = t.substr(0, p.second) + s.substr(p.first);
      string y = s.substr(0, p.first) + t.substr(p.second);
      cerr << x << " " << y << endl;
      s = x;
      t = y;
    }
  }
}
