Problem:
Score : 900 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 vertex is uncolored.

Takahashi and Aoki is playing a game by painting the vertices. In this game, they alternately perform the following operation, starting from Takahashi:

Select a vertex that is not painted yet.

If it is Takahashi who is performing this operation, paint the vertex white; paint it black if it is Aoki.

Then, after all the vertices are colored, the following procedure takes place:

Repaint every white vertex that is adjacent to a black vertex, in black.

Note that all such white vertices are repainted simultaneously, not one at a time.

If there are still one or more white vertices remaining, Takahashi wins; if all the vertices are now black, Aoki wins.
Determine the winner of the game, assuming that both persons play optimally.

Constraints

2 ≤ N ≤ 10^5

1 ≤ a_i,b_i ≤ N

a_i ≠ b_i

The input graph is a tree.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
:
a_{N-1} b_{N-1}

Output

Print First if Takahashi wins; print Second if Aoki wins.

Sample Input 1

3
1 2
2 3

Sample Output 1

First

Below is a possible progress of the game:

First, Takahashi paint vertex 2 white.

Then, Aoki paint vertex 1 black.

Lastly, Takahashi paint vertex 3 white.

In this case, the colors of vertices 1, 2 and 3 after the final procedure are black, black and white, resulting in Takahashi's victory.

Sample Input 2

4
1 2
2 3
2 4

Sample Output 2

First

Sample Input 3

6
1 2
2 3
3 4
2 5
5 6

Sample Output 3

Second

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

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

const int maxn = 1e5 + 5;
int n;
int mod = 0;
int change = 0;

vector<int> g[maxn];
vector<int> cnt[maxn];

bool mark[maxn];

bool is = true;
int odd = 0;

void dfs(int v, int dis) {
	mark[v] = true;
	if(g[v].size() == 1) {
		if(dis % 2 != 0) {
			odd++;
			is = false;
		}
	}
	for(int i = 0; i < g[v].size(); i++) {
		if(!mark[g[v][i]])
			dfs(g[v][i], dis + 1);
	}
}
bool check() {
	dfs(0, 0);
	if(is || odd >= 2)
		return true;
	is = true;
	memset(mark, 0, sizeof mark);
	change = 0;
	mod = 0;
	odd = 0;
	dfs(g[0][0], 0);
	if(is || odd >= 2) {
		return true;
	}
	return false;
}

int main() {
	cin >> n;
	for(int i = 0; i < n - 1; i++) {
		int u, v;
		cin >> u >> v;
		u--, v--;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < g[i].size(); j++) {
			cnt[i].push_back(g[g[i][j]].size());
		}
	}
	for(int i = 0; i < n; i++) {
		sort(cnt[i].begin(), cnt[i].end());
	}
	string ans = "Second";
	for(int i = 0; i < n; i++){
		if(cnt[i].size() >= 2)
			if(cnt[i][0] == 1 && cnt[i][1] == 1) {
				ans = "First";
				return cout << "First", 0;
			}
	}
	if(check()) {
		ans = "First";
		return cout << "First", 0;
	}
	

	cout << ans;
	return 0;
}