#include <bits/stdc++.h>
using namespace std;
int ar[1000005];
int mSize[1000005];
int DSU[1000005];
int find(int x) {
  if (DSU[x] == x) return x;
  return DSU[x] = find(DSU[x]);
}
void merge(int x, int y) {
  if (mSize[find(x)] >= mSize[find(y)]) {
    mSize[find(x)] += mSize[find(y)];
    DSU[find(y)] = DSU[find(x)];
  } else {
    mSize[find(y)] += mSize[find(x)];
    DSU[find(x)] = DSU[find(y)];
  }
}
vector<int> header;
int tmp;
int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);
  int n, tmp;
  cin >> n;
  int count = 1;
  string c, b;
  map<string, pair<int, string>> idx;
  map<string, string> ans;
  for (int i = 0; i < n; i++) {
    cin >> b >> c;
    if (idx[b].first != 0) {
      idx[c].first = count;
      idx[c].second = c;
      tmp = find(idx[b].first);
      DSU[count] = tmp;
      count++;
      auto it = idx.begin();
      for (; it != idx.end(); it++) {
        if ((it->second).first == tmp) break;
      }
      ans[(it->second).second] = c;
    } else {
      idx[b].first = count;
      idx[b].second = b;
      idx[c].first = count + 1;
      idx[c].second = c;
      DSU[count] = DSU[count + 1] = count;
      header.push_back(count);
      count += 2;
      ans[b] = c;
    }
  }
  cout << ans.size() << endl;
  for (auto it = ans.begin(); it != ans.end(); it++) {
    cout << it->first << " " << it->second << "\n";
  }
}
