#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define fastcall __attribute__((optimize("-O3")))
#define IL  __inline__ __attribute__((always_inline))
#include <bits/stdc++.h>
#define getchar getchar_unlocked
#define putchar putchar_unlocked
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAXN = 1e5 + 10;
int n, fa[MAXN];
set<int> s[MAXN];
queue<pii> q;
map<ll, int> g;
template <class T>
IL void _read(T &u)
{
    u = 0;
    char t = getchar();
    while (!isdigit(t)) t = getchar();
    while (isdigit(t))
    {
        u = u * 10 + t - '0';
        t = getchar();
    }
}
template <class T>
inline void print(T x)
{
    if(x < 0)
    {
        putchar('-');
        x = -x;
    }
    if(x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}
inline int getfa(int u)
{
	return fa[u] == u ? u : (fa[u] = getfa(fa[u]));
}
IL ll getid(int x, int y)
{
	if(x > y) swap(x, y);
	return 1ll * n * y + x;
}
IL void ae(int u, int v)
{
	s[u].insert(v);
	s[v].insert(u);
	ll eid = getid(u, v);
	int t = ++g[eid];
	if(t == 2)
		q.push(mp(u, v));
}
IL void re(int u, int v)
{
	s[u].erase(v);
	s[v].erase(u);
	g.erase(getid(u, v));
}
IL bool solve()
{
	for(int i = 1; i <= n; ++i) fa[i] = i;
	for(int i = 1; i < n; ++i)
	{
		int u, v;
		if(q.empty())
			return false;
		u = q.front().first;
		v = q.front().second;
		q.pop();
		u = getfa(u);
		v = getfa(v);
		if(s[u].size() > s[v].size())
			swap(u, v);
		fa[u] = v;
		re(u, v);
		for(set<int> :: iterator i = s[u].begin(), j; i != s[u].end(); i = j)
		{
			j = i; ++j; 
			int x = *i;
			x = getfa(x);
			re(u, x);
			ae(v, x);
		}
	}
	return true;
}
int main()
{
	_read(n);
	for(int i = 1, u, v; i <= (n - 1) << 1; ++i)
	{
		_read(u), _read(v);
		ae(u, v);
	}
	puts(solve() ? "YES" : "NO");
	return 0;
}

Measured memory_bytes: 36608