#include <bits/stdc++.h>
using namespace std;

#ifdef SG
	#include <debug.h>
#else
	template<typename T> struct outputer;
	struct outputable {};
	#define PRINT(...)
	#define OUTPUT(...)
	#define show(...)
	#define debug(...)
	#define deepen(...)
	#define timer(...)
	#define fbegin(...)
	#define fend
	#define pbegin(...)
	#define pend
#endif

#define ARG4(_1,_2,_3,_4,...) _4

#define forn3(i,l,r) for (int i = int(l); i < int(r); ++i)
#define forn2(i,n) forn3 (i, 0, n)
#define forn(...) ARG4(__VA_ARGS__, forn3, forn2) (__VA_ARGS__)

#define ford3(i,l,r) for (int i = int(r) - 1; i >= int(l); --i)
#define ford2(i,n) ford3 (i, 0, n)
#define ford(...) ARG4(__VA_ARGS__, ford3, ford2) (__VA_ARGS__)

#define ve vector
#define pa pair
#define tu tuple
#define mp make_pair
#define mt make_tuple
#define pb emplace_back
#define fs first
#define sc second
#define all(a) (a).begin(), (a).end()
#define sz(a) ((int)(a).size())

typedef long double ld;
typedef int64_t ll;
typedef uint64_t ull;
typedef uint32_t ui;
typedef uint16_t us;
typedef uint8_t uc;
typedef pa<int, int> pii;
typedef pa<int, ll> pil;
typedef pa<ll, int> pli;
typedef pa<ll, ll> pll;
typedef ve<int> vi;

template<typename T> inline auto sqr (T x) -> decltype(x * x) {return x * x;}
template<typename T1, typename T2> inline bool umx (T1& a, T2 b) {if (a < b) {a = b; return 1;} return 0;}
template<typename T1, typename T2> inline bool umn (T1& a, T2 b) {if (b < a) {a = b; return 1;} return 0;}

const int N = 100000;

struct Input {
	int n;
	int a[N], b[N], c[N], d[N];
	
	bool read () {
		if (!(cin >> n)) {
			return 0;
		}
		forn (i, n - 1) {
			scanf("%d%d", &a[i], &b[i]);
			--a[i];
			--b[i];
		}
		forn (i, n - 1) {
			scanf("%d%d", &c[i], &d[i]);
			--c[i];
			--d[i];
		}
		return 1;
	}

	void init (const Input &input) {
		*this = input;
	}
};

struct Data: Input {
	bool ans;
	
	void write () {
		puts(ans ? "YES" : "NO");
	}
};


namespace Main {
	
	struct Solution: Data {
		set<int> ra[N], rb[N], rc[N], rd[N];
		
		set<pii> e, f;
		set<pii> q;
		
		void adde (int i) {
			ra[a[i]].insert(i);
			rb[b[i]].insert(i);
			int x = a[i], y = b[i];
			if (x > y) {
				swap(x, y);
			}
			pii key = mp(x, y);
			if (f.count(key)) {
				q.insert(key);
			}
			e.insert(key);
		}
		
		void addf (int i) {
			rc[c[i]].insert(i);
			rd[d[i]].insert(i);
			int x = c[i], y = d[i];
			if (x > y) {
				swap(x, y);
			}
			pii key = mp(x, y);
			if (e.count(key)) {
				q.insert(key);
			}
			f.insert(key);
		}
		
		void dele (int i) {
			ra[a[i]].erase(i);
			rb[b[i]].erase(i);
			int x = a[i], y = b[i];
			if (x > y) {
				swap(x, y);
			}
			pii key = mp(x, y);
			if (f.count(key)) {
				q.erase(key);
			}
			e.erase(key);
		}
		
		void delf (int i) {
			rc[c[i]].erase(i);
			rd[d[i]].erase(i);
			int x = c[i], y = d[i];
			if (x > y) {
				swap(x, y);
			}
			pii key = mp(x, y);
			if (e.count(key)) {
				q.erase(key);
			}
			f.erase(key);
		}
		
		int cnt (int i) {
			return sz(ra[i]) + sz(rb[i]) + sz(rc[i]) + sz(rd[i]);
		}
		
		void solve () {
			forn (i, n - 1) {
				adde(i);
				addf(i);
			}
			forn (i, n - 1) {
				if (sz(q) == 0) {
					ans = 0;
					return;
				}
				int x = q.begin()->fs;
				int y = q.begin()->sc;
				q.erase(q.begin());
				if (cnt(x) > cnt(y)) {
					swap(x, y);
				}
				set<int> ea = ra[x];
				set<int> eb = rb[x];
				set<int> fc = rc[x];
				set<int> fd = rd[x];
				for (int e : ea) {
					dele(e);
					assert(a[e] == x);
					a[e] = y;
					if (a[e] != b[e]) {
						adde(e);
					}
				}
				for (int e : eb) {
					dele(e);
					assert(b[e] == x);
					b[e] = y;
					if (a[e] != b[e]) {
						adde(e);
					}
				}
				for (int f : fc) {
					delf(f);
					assert(c[f] == x);
					c[f] = y;
					if (c[f] != d[f]) {
						addf(f);
					}
				}
				for (int f : fd) {
					delf(f);
					assert(d[f] == x);
					d[f] = y;
					if (c[f] != d[f]) {
						addf(f);
					}
				}
			}
			ans = 1;
		}
		
		void clear () {
			*this = Solution();
		}
	};
}


Main::Solution sol;

int main () {
	cout.setf(ios::showpoint | ios::fixed);
	cout.precision(20);

	#ifdef SG
		freopen((problemname + ".in").c_str(), "r", stdin);
//		freopen((problemname + ".out").c_str(), "w", stdout);
		while (sol.read()) {
			sol.solve();
			sol.write();
			sol.clear();
		}
	#else
		sol.read();
		sol.solve();
		sol.write();
	#endif
	
	/*
	int t;
	cin >> t;
	forn (i, t) {
		sol.read();
		sol.solve();
		sol.write();
		sol.clear();
	}
	*/
	
	return 0;
}


Measured memory_bytes: 50560