import std.stdio, std.array, std.string, std.conv, std.algorithm;
import std.typecons, std.range, std.random, std.math, std.container;
import std.numeric, std.bigint, core.bitop;

int N;
int[][] edges;
int[] depth;

void dfs(int n, int prev, int d) {
    depth[n] = d;
    foreach (m; edges[n]) if (m != prev) dfs(m, n, d+1);
}


void main() {
    N = readln.chomp.to!int;
    edges = new int[][](N);
    depth = new int[](N);
    foreach (i; 0..N-1) {
        auto s = readln.split.map!(to!int);
        auto a = s[0]-1;
        auto b = s[1]-1;
        edges[a] ~= b;
        edges[b] ~= a;
    }

    if (N == 2) {
        writeln("Second");
        return;
    }
    if (N == 3) {
        writeln("First");
        return;
    }

    dfs(0, -1, 1);
    if (N % 2 == 1 && depth.map!(d => d == N).any) {
        writeln("First");
        return;
    }

    foreach (i; 0..N) {
        if (edges[i].map!(j => edges[j].length == 1).sum > 1) {
            writeln("First");
            return;
        }
    }

    writeln("Second");
}
