Andrew, Fedor and Alex are inventive guys. Now they invent the game with strings for two players.

Given a group of n non-empty strings. During the game two players build the word together, initially the word is empty. The players move in turns. On his step player must add a single letter in the end of the word, the resulting word must be prefix of at least one string from the group. A player loses if he cannot move.

Andrew and Alex decided to play this game k times. The player who is the loser of the i-th game makes the first move in the (i + 1)-th game. Guys decided that the winner of all games is the player who wins the last (k-th) game. Andrew and Alex already started the game. Fedor wants to know who wins the game if both players will play optimally. Help him.

Input

The first line contains two integers, n and k (1 ≤ n ≤ 105; 1 ≤ k ≤ 109).

Each of the next n lines contains a single non-empty string from the given group. The total length of all strings from the group doesn't exceed 105. Each string of the group consists only of lowercase English letters.

Output

If the player who moves first wins, print "First", otherwise print "Second" (without the quotes).

Examples

Input

2 3
a
b


Output

First


Input

3 1
a
b
c


Output

First


Input

1 2
ab


Output

Second
import java.util.InputMismatchException;
import java.math.BigInteger;
import java.io.*;
import java.util.*;

/**
 * Generated by Contest helper plug-in
 * Actual solution is at the bottom
 */

public class Main {
	public static void main(String[] args) {
		InputReader in = new StreamInputReader(System.in);
		PrintWriter out = new PrintWriter(System.out);
		run(in, out);
	}

	public static void run(InputReader in, PrintWriter out) {
		Solver solver = new Task();
		solver.solve(1, in, out);
		Exit.exit(in, out);
	}
}

abstract class InputReader {
	private boolean finished = false;

	public abstract int read();

	public long readLong() {
		return new BigInteger(readString()).longValue();
	}

	public int readInt() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		int sgn = 1;
		if (c == '-') {
			sgn = -1;
			c = read();
		}
		int res = 0;
		do {
			if (c < '0' || c > '9')
				throw new InputMismatchException();
			res *= 10;
			res += c - '0';
			c = read();
		} while (!isSpaceChar(c));
		return res * sgn;
	}

	public String readString() {
		int c = read();
		while (isSpaceChar(c))
			c = read();
		StringBuffer res = new StringBuffer();
		do {
			res.appendCodePoint(c);
			c = read();
		} while (!isSpaceChar(c));
		return res.toString();
	}

	private boolean isSpaceChar(int c) {
		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	}

	public void setFinished(boolean finished) {
		this.finished = finished;
	}

	public abstract void close();
}

class StreamInputReader extends InputReader {
	private InputStream stream;
	private byte[] buf = new byte[1024];
	private int curChar, numChars;

	public StreamInputReader(InputStream stream) {
		this.stream = stream;
	}

	public int read() {
		if (numChars == -1)
			throw new InputMismatchException();
		if (curChar >= numChars) {
			curChar = 0;
			try {
				numChars = stream.read(buf);
			} catch (IOException e) {
				throw new InputMismatchException();
			}
			if (numChars <= 0)
				return -1;
		}
		return buf[curChar++];
	}

	public void close() {
		try {
			stream.close();
		} catch (IOException ignored) {
		}
	}
}

class Exit {
	private Exit() {
	}

	public static void exit(InputReader in, PrintWriter out) {
		in.setFinished(true);
		in.close();
		out.close();
	}
}

interface Solver {
	public void solve(int testNumber, InputReader in, PrintWriter out);
}

class Task implements Solver {
	
	public void solve(int testNumber, InputReader in, PrintWriter out) {
		
		int n = in.readInt();
		long k = in.readLong();
		
		boolean oddk = k%2 == 1;
		
		Node base = new Node();
		
		boolean first = true;
		int min = 0;
		int max = 0;
		
		String[] words = new String[n];
		for (int i = 0; i<n; i++) {
			String w = in.readString();
			
			if (first) {
				min = w.length();
				max = w.length();
				first = false;
			} else {
				if (w.length() < min)
					min = w.length();
				if (w.length() > max)
					max = w.length();
			}
			Node current = base;
			for (int j = 0; j<w.length(); j++) {
				int c = w.charAt(j)-97;
				if (null == current.links[c])
					current.links[c] = new Node();
				current = current.links[c];
			}
			current.val = 1;
		}
		
		boolean firstwin = forcewin(base,0);
		boolean firstlose = forcelose(base,0);
		
		//System.out.println(firstwin);
		//System.out.println(firstlose);
		
		boolean win = true;
		
		if (!firstwin)
			win = false;
		else if (firstwin && firstlose)
			win = true;
		else
			win = oddk;
		
		/*
		if (firstwin && firstlose)
			win = true;
		else if (!firstwin && !firstlose)
			win = false;
		else if (firstwin)
			win = oddk;
		else
			win = false;
		*/
		
		if (win)
			System.out.println("First");
		else
			System.out.println("Second");
		
		//if (n == 50000 && k == 54533605) {
		//	System.out.println(min + " " + max);
		//	System.out.println(firstwin + " " + firstlose);
		//}
		
	}
	
	private boolean forcewin(Node current, int depth) {
		if (depth%2 == 0) { //first player choose
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (forcewin(current.links[i],depth+1))
						return true;
			return false;
		} else { // must be able to forcewin from every case
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (!forcewin(current.links[i],depth+1))
						return false;
			return true;
		}
	}
	
	private boolean forcelose(Node current, int depth) {
		if (depth%2 == 0) { //first player choose
			for (int i = 0; i<26; i++)
				if (null != current.links[i])
					if (forcelose(current.links[i],depth+1))
						return true;
			if (current.val == 1)
				return true;
			return false;
		} else { // must be able to forcelose from every case
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (!forcelose(current.links[i],depth+1))
						return false;
			if (current.val == 1)
				return false;
			return true;
		}
	}

	private boolean rec2(Node current, int depth) {
		if (depth%2 == 0) {
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (rec2(current.links[i],depth+1))
						return true;
			return false;
		} else {
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (!rec2(current.links[i],depth+1))
						return false;
			return true;
		}
	}

	private boolean rec1(Node current, int depth) {
		if (depth%2 == 0) {
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (rec1(current.links[i],depth+1))
						return true;
			return false;
		} else {
			for (int i = 0; i<26; i++) 
				if (null != current.links[i])
					if (!rec1(current.links[i],depth+1))
						return false;
			return true;
		}
	}
	
}

class Node {
	
	public int val;
	public Node[] links;
	
	public Node() {	
		val = 0;
		links = new Node[26];
	}
	
}

///

