#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5;
int a,b;
int p[N+10];
// 标记走过的房间
bool vis[N+10];
int find(int x)
{
if(p[x]!=x)
p[x]=find(p[x]);
return p[x];
}
void Union(int a,int b)
{
int pa=find(a);
int pb=find(b);
if(pa!=pb)
p[pb]=pa;
}
int main()
{
while(cin>>a>>b)
{
if(a==-1&&b==-1)
break;
// a,b 均为 0 时,也要输出 Yes;空树也是树
if(a==0&&b==0)
{
cout<<"Yes"<<endl;
continue;
}
for(int i=1;i<=N;i++)
p[i]=i,vis[i]=0;
int maxx=0;
bool flag=0;
while(a||b)
{
vis[a]=1;
vis[b]=1;
//是否成环
if(find(a)==find(b))
flag=1;
Union(a,b);
// 找出房间编号的最大值
maxx=max(maxx,max(a,b));
cin>>a>>b;
}
if(flag)
cout<<"No"<<endl;
else
{
int cnt=0;
// 计算共有几个符合条件的联通集合
for(int i=1;i<=maxx;i++)
if(vis[i]&&p[i]==i)
cnt++;
// 这里可能存在不止一个集合,这样的话 ans 值就大于 1 了,这样就不满足题意了,就该输出 No
if(cnt==1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
return 0;
}