#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 228;
int pos[N], v[N];
int n;
vector<string> kek;
vector<int> g[N];
set<int> not_used[N];
int us[N], mt[N];
string ans[N], str1[N], str2[N];
void add_edge(int i, int j) { g[i].push_back(j); }
bool kuhn(int v) {
  if (us[v]) return 0;
  us[v] = 1;
  for (int i = 0; i < g[v].size(); i++) {
    int u = g[v][i];
    if (mt[u] == -1 || kuhn(mt[u])) {
      mt[u] = v;
      return true;
    }
  }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  set<string> st, stx, sty;
  map<string, int> ctx;
  for (int i = 1; i <= n; i++) {
    cin >> str1[i] >> str2[i];
    string x = "", y = "";
    x += str1[i][0];
    x += str1[i][1];
    x += str1[i][2];
    y += str1[i][0];
    y += str1[i][1];
    y += str2[i][0];
    stx.insert(x);
    ctx[x]++;
    sty.insert(y);
    st.insert(x);
    st.insert(y);
  }
  for (string s : st) {
    kek.push_back(s);
  }
  for (int i = 1; i <= n; i++) {
    string x = "", y = "";
    x += str1[i][0];
    x += str1[i][1];
    x += str1[i][2];
    y += str1[i][0];
    y += str1[i][1];
    y += str2[i][0];
    if (ctx[x] == 1) add_edge(i, find(kek.begin(), kek.end(), x) - kek.begin());
    add_edge(i, find(kek.begin(), kek.end(), y) - kek.begin());
  }
  for (int i = 0; i < kek.size(); i++) {
    mt[i] = -1;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < kek.size(); j++) {
      us[j] = 0;
    }
    if (!kuhn(i)) {
      cout << "NO\n";
      return 0;
    }
  }
  for (int i = 0; i < kek.size(); i++) {
    if (mt[i] != -1) ans[mt[i]] = kek[i];
  }
  cout << "YES\n";
  for (int i = 1; i <= n; i++) {
    cout << ans[i] << "\n";
  }
  return 0;
}
