#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T GCD(T a, T b) {
  return b ? GCD(b, a % b) : a;
}
template <class T>
inline T LCM(T a, T b) {
  if (a < 0) return LCM(-a, b);
  if (b < 0) return LCM(a, -b);
  return a * (b / GCD(a, b));
}
template <class T>
inline T POW1(T a, T b, T m) {
  long long x = 1, y = a;
  while (b > 0) {
    if (b % 2 == 1) {
      x = (x * y);
      if (x > m) x %= m;
    }
    y = (y * y);
    if (y > m) y %= m;
    b /= 2;
  }
  return x;
}
template <class T>
inline T INV(T n, T m) {
  return POW1(n, m - 2, m);
}
template <class T>
inline T SUB(T a, T b, T m) {
  return (a % m - b % m + m) % m;
}
template <class T>
inline T ADD(T a, T b, T m) {
  return (a % m + b % m) % m;
}
template <class T>
inline T MUL(T a, T b, T m) {
  return (a % m * b % m) % m;
}
template <class T>
inline T DIV(T a, T b, T m) {
  return (a % m * (INV(b, m)) % m) % m;
}
int main() {
  long long int n;
  cin >> n;
  vector<pair<string, string> > v, ans;
  string a, b;
  string old, neww;
  for (long long int i = 0; i < n; i++) {
    cin >> a >> b;
    v.push_back(make_pair(a, b));
  }
  vector<long long int> visited(n, 0);
  for (long long int i = 0; i < n; i++) {
    if (visited[i] == 0) {
      visited[i] = 1;
      old = v[i].first;
      neww = v[i].second;
      for (long long int j = i + 1; j < n; j++) {
        if (v[j].first == neww) {
          visited[j] = 1;
          neww = v[j].second;
        }
      }
      ans.push_back(make_pair(old, neww));
    }
  }
  cout << ans.size() << endl;
  for (long long int i = 0; i < ans.size(); i++)
    cout << ans[i].first << " " << ans[i].second << endl;
  return 0;
}
