#include<iostream>
#include<set>
#include<vector>
#include<string>
#include<map>
#include<stack>
using namespace std;

struct Node{
  int name;
  vector<int> edges;
  bool done;
};

set<int> search(vector<Node> g) {

  int now;
  for(int i=0; i<=6; i++)
    if(!g[i].edges.empty())
      now = i;

  stack<int> q;
  set<int> done;
  done.insert(now);
  q.push(now);

  while(!q.empty()) {
    now = q.top();
    done.insert(now);
    q.pop();

    for(int i=0; i<g[now].edges.size(); i++)
      if( done.find(g[now].edges[i])==done.end() ) {
	q.push( g[now].edges[i] );
	//cout<<"edge"<<now<<endl;
      }
  }
  return done;
}

int main() {

  int d,count;
  while(cin>>d) {
    string s;
    set<int> used;
    map<int,int> edge;

    vector<Node> graph;
    for(int i=0; i<=6; i++) {
      Node l;
      l.name = i;
      l.done = false;
      graph.push_back(l);
    }

    for(int i=0; i<d; i++) {
      cin>>s;
      for(int j=0; j<2; j++) {
	used.insert(s.at(j)-'0');
	if(edge.find(s.at(j)-'0')!=edge.end())
	  edge[s.at(j)-'0']++;
	else
	  edge[s.at(j)-'0']=1;
      }
      graph[s.at(0)-'0'].edges.push_back(s.at(1)-'0');
      graph[s.at(1)-'0'].edges.push_back(s.at(0)-'0');
    }

    set<int> con;
    con = search(graph);

    /*
    for(set<int>::iterator it=con.begin(); it!=con.end(); it++)
      cout<<"Set "<<(*it)<<endl;
    */

    for(int i=0; i<graph.size(); i++)
      if(con.find(i)==con.end() && !graph[i].edges.empty() ) {
	//cout<<i<<endl;
	cout<<"No"<<endl;
	goto NEXT;
      }

    count=0;
    for(int i=0; i<graph.size(); i++) {
      if(graph[i].edges.size()%2==1) {
	count++;
	//cout<<i<<endl;
      }
    }

    if(count==0 || count==2) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;

  NEXT:
    ;
  }
}