Problem:
Score : 1400 points

Problem Statement

There is a tree with N vertices numbered 1 through N.
The i-th of the N-1 edges connects vertices a_i and b_i.

Initially, each edge is painted blue.
Takahashi will convert this blue tree into a red tree, by performing the following operation N-1 times:

Select a simple path that consists of only blue edges, and remove one of those edges.

Then, span a new red edge between the two endpoints of the selected path.

His objective is to obtain a tree that has a red edge connecting vertices c_i and d_i, for each i.

Determine whether this is achievable.

Constraints

2 ≤ N ≤ 10^5

1 ≤ a_i,b_i,c_i,d_i ≤ N

a_i ≠ b_i

c_i ≠ d_i

Both input graphs are trees.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
:
a_{N-1} b_{N-1}
c_1 d_1
:
c_{N-1} d_{N-1}

Output

Print YES if the objective is achievable; print NO otherwise.

Sample Input 1

3
1 2
2 3
1 3
3 2

Sample Output 1

YES

The objective is achievable, as below:

First, select the path connecting vertices 1 and 3, and remove a blue edge 1-2. Then, span a new red edge 1-3.

Next, select the path connecting vertices 2 and 3, and remove a blue edge 2-3. Then, span a new red edge 2-3.

Sample Input 2

5
1 2
2 3
3 4
4 5
3 4
2 4
1 4
1 5

Sample Output 2

YES

Sample Input 3

6
1 2
3 5
4 6
1 6
5 1
5 3
1 4
2 6
4 3
5 6

Sample Output 3

NO

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

/******************************************
*    AUTHOR:         CHIRAG AGARWAL       *
*    INSTITUITION:   BITS PILANI, PILANI  *
******************************************/
#include <bits/stdc++.h>
using namespace std;
 
typedef long long LL; 
typedef long double LD;
const int MAX=1e5+5;

map<pair<int,int>,int> mpbl; 
map<pair<int,int>,int> mprd;
set<int> degbl[MAX];
set<int> degrd[MAX];
set<pair<int,int> > dg;
vector<int> te;

void addbl(int a,int b)
{
	if(a>b)
	{
		swap(a,b);
	}
	degbl[a].insert(b);
	degbl[b].insert(a);
	mpbl[make_pair(a,b)]++;
	if(mprd[make_pair(a,b)]>0)
	{
		dg.insert(make_pair(a,b));
	}
}


void addrd(int a,int b)
{
	if(a>b)
	{
		swap(a,b);
	}
	degrd[a].insert(b);
	degrd[b].insert(a);
	mprd[make_pair(a,b)]++;
	if(mpbl[make_pair(a,b)]>0)
	{
		dg.insert(make_pair(a,b));
	}
}

void erasebl(int a,int b)
{
	if(a>b)
	{
		swap(a,b);
	}
	degbl[a].erase(degbl[a].find(b));
	degbl[b].erase(degbl[b].find(a));
	mpbl[make_pair(a,b)]--;
}


void eraserd(int a,int b)
{
	if(a>b)
	{
		swap(a,b);
	}
	degrd[a].erase(degrd[a].find(b));
	degrd[b].erase(degrd[b].find(a));
	mprd[make_pair(a,b)]--;
}



int main() 
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int a,b;
		scanf("%d %d",&a,&b);
		addbl(a,b);
	}
	for(int i=1;i<n;i++)
	{
		int a,b;
		scanf("%d %d",&a,&b);
		addrd(a,b);
	}
	int cnt=0;
	while(dg.size())
	{
		pair<int,int> tmp=*(dg.begin());
		dg.erase(dg.begin());
		int a=tmp.first;
		int b=tmp.second;
		erasebl(a,b);
		eraserd(a,b);
		if(degrd[a].size()+degbl[a].size()>degbl[b].size()+degrd[b].size())
		{
			swap(a,b);
		}
		te.clear();
		for(set<int>::iterator it=degrd[a].begin();it!=degrd[a].end();it++)
		{
			te.push_back(*it);
		}
		for(int i=0;i<te.size();i++)
		{
			addrd(b,te[i]);
		}
		te.clear();

		for(set<int>::iterator it=degbl[a].begin();it!=degbl[a].end();it++)
		{
			te.push_back(*it);
		}
		for(int i=0;i<te.size();i++)
		{
			addbl(b,te[i]);
		}
		cnt++;
	}
	if(cnt==(n-1))
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}