import sys sys.setrecursionlimit(1000000) N = int(input()) G = {i:[] for i in range(1,N+1)} for _ in range(N-1): a,b = map(int,input().split()) G[a].append(b) G[b].append(a) A = [] for i in range(1,N+1): if len(G[i])==1: A.append(i) if len(A)==2: ans = "Yes" else: from collections import deque dist = [-1]*(N+1) dist[A[0]] = 0 que = deque([A[0]]) while que: v = que.popleft() for i in G[v]: if dist[i]<0: dist[i] = dist[v]+1 que.append(i) if dist[A[1]]%2==1: ans = "No" else: B = [A[0]] def dfs(i,p): global A,B if i==A[1]: return True for j in G[i]: if j==p:continue B.append(j) if dfs(j,i): return True B.pop() return False dfs(A[0],-1) rt = B[len(B)//2] dist = [-1]*(N+1) dist[rt] = 0 que = deque([rt]) while que: u = que.popleft() for v in G[u]: if dist[v]<0: dist[v] = dist[u]+1 que.append(v) C1 = [[i,i] for i in range(N+1)] cnt = 0 def dfs1(i,p): global cnt C1[i][0] = cnt cnt += 1 for j in G[i]: if j==p:continue dfs1(j,i) C1[i][1] = cnt cnt += 1 dfs1(rt,-1) C = [(C1[i][1]-C1[i][0])//2 for i in range(N+1)] C2 = {} for i in range(1,N+1): d = dist[i] if d not in C2: C2[d] = set() C2[d].add(C[i]) ans = "Yes" for d in C2: if len(C2[d])>1: ans = "No" break print(ans)