import std.stdio, std.conv, std.string;
import std.array, std.range, std.algorithm, std.container;
import std.math, std.random, std.bigint, std.datetime, std.format;
string read(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }

int DEBUG_LEVEL = 0;
void print()(){ writeln(""); }
void print(T, A ...)(T t, lazy A a){ write(t), print(a); }
void print(int level, T, A ...)(T t, lazy A a){ if(level <= DEBUG_LEVEL) print(t, a); }

void main(string[] args){
	if(args.length > 1 && args[1] == "-debug"){
		if(args.length > 2 && args[2].isNumeric) DEBUG_LEVEL = args[2].to!int;
		else DEBUG_LEVEL = 1;
	}
	
	// ----------------------------------------
	
	int n = read.to!int;
	Node[] nodes;
	foreach(i; 0 .. n) nodes ~= new Node(i);
	
	foreach(i; 0 .. n - 1){
		long a = read.to!long - 1;
		long b = read.to!long - 1;
		nodes[a].nodes ~= nodes[b];
		nodes[b].nodes ~= nodes[a];
	}
	
	print!1("nodes:", nodes);
	
	// 直径の両端を求める
	foreach(nd; nodes) nd.isVisited = 0;
	Node p = nodes[uniform(0, n)].furthest;
	foreach(nd; nodes) nd.isVisited = 0;
	Node q = p.furthest;
	print!1("p:", p, " q:", q);
	
	// pからqまでの距離(直径)
	foreach(nd; nodes) nd.isVisited = 0;
	p.setp(0);
	int d = q.dp;
	
	string ans;
	if((d - 1) % 3 == 0) ans = "Second";
	else ans = "First";
	
	ans.writeln;
}
/*

「葉をすべて削除」
「指定した1つの葉以外のすべての葉を削除」
という行動ができる。

直径がどう変わるか？
・直径は1減る（直径に寄与している葉を指定したとき）
・直径は2減る（その他を指定したとき）

※直径が1のときは直径に寄与している葉しかないので後手勝ち

直径が0のときは先手勝ち

ニムをする。(直径-1)を0にしたらよいゲーム。
(直径-1)を3で割った余りに注目し、余りが0なら後手勝ち。それ以外は先手勝ち。

*/

class Node{
	long id;
	int dp, dq, d;
	bool isVisited;
	Node[] nodes;
	this(long id){
		this.id = id;
	}
	Node furthest(){ // O(n) // isVisitedをクリアしてから呼ぶこと
		Node res = this;
		Node[] q = [this];
		int iq = 0;
		this.isVisited = 1;
		while(iq < q.length){
			foreach(nd; q[iq].nodes) if(! nd.isVisited) nd.isVisited = 1, q ~= nd;
			iq ++;
		}
		return q[$ - 1];
	}
	void setp(int d){
		this.isVisited = 1;
		this.dp = d;
		foreach(nd; nodes) if(! nd.isVisited) nd.setp(d + 1);
	}
	void setq(int d){
		this.isVisited = 1;
		this.dq = d;
		foreach(nd; nodes) if(! nd.isVisited) nd.setq(d + 1);
	}
	
	override string toString(){
		return id.to!string ~ "(" ~ dp.to!string ~ " " ~ dq.to!string ~ " " ~ d.to!string ~ ")" ~ nodes.map!(x => x.id.to!string).join(" ");
	}
}
