// standard dp 
// three partition problem
// naieve recursion solution
#include <bits/stdc++.h>
 
# define C continue;
# define R return
 
# define D double
# define I insert
# define ll long long
# define ld long double
 
# define ull unsigned long long
# define ui unsigned int
 
# define pb push_back
# define pf push_front
 
# define vi vector < int >
# define vc vector < char >
# define vs vector < string >
# define vb vector < bool >
# define vd vector < D >
# define vll vector < ll >
# define vull vector < ull >
# define vld vector < ld >
# define PQ priority_queue
 
# define vvi vector < vector < int > >
# define vvb vector < vector < bool > >
# define vvc vector < vector < char > >
# define vvll vector < vector < ll > >
# define vvd vector < vector < D > >
# define vvld vector < vector < ld > >
 
# define all(v) (v).begin() , (v).end()
# define allrev(v) (v).rbegin() , (v).rend()
# define allcomp(v) v.begin() , v.end() , comp
# define allrevcomp(v) v.rbegin() , v.rend() , comp
 
# define pii pair < int , int >
# define pll pair < ll , ll >
# define pld pair < ld , ld >
# define pDD pair < D , D >
# define pipii pair<int, pii >
# define pcpii pair<char,pii>
 
# define vpld vector < pld >
# define vpii vector < pii >
# define vpll vector < pll >
# define vpDD vector < pDD >
 
# define vvpii vector < vector < pii > >
# define vpipii vector< pipii >
 
# define F first
# define S second
# define mp make_pair
 
# define unm unordered_map
# define unmii unm< int , int >
# define unmll unm< ll , ll >
# define unms unm<string,int>
# define unmci unm<char,int>
 
# define sortvia sort(a.begin(),a.end());
# define sortvib sort(b.begin(),b.end());
# define revsorta sort(a.begin(), a.end(), greater <int>());
# define revsortb sort(b.begin(), b.end(), greater <>());
# define loop(q,n) for(int i=q;i<n;i++)
# define test int t;cin >> t;while(t--)
# define nextline "\n"
# define tab "\t"
# define space " "
//vector<vector<int> > vec( n , vector<int> (m, 0));
//YES
//NO
//cout
//true
//false
//yes
//no
 
const ll mod9=1e9+7;
const ll maxsize=2e9+1;
// const ll mod =998244353;
const ll mod2=1073741824;
const ll INF=1e18L+5;
const int two_pow_fiv=200008;
const int IINF=1e8+5;
using namespace std;

string first,second,third;
int n,m,o;
int cnt=0;

bool recur(int i, int j,int k){
    cnt++;
    cout<<i<<space<<j<<space<<k<<nextline;
    bool a=false,b=false;
    // base case we reach the end like we should
    if(i==n and j==m and k==o)return true;
    // base case one of the string completes first
    if(i>n or j>m or k>o)return false;
    if(first[i]==third[k])a = recur(i+1,j,k+1);
    if(second[j]==third[k])b = recur(i,j+1,k+1);
    return (a or b);

}

int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
#endif
    int n,k;
    cin>>n>>k;
    vi a(n);
    loop(0,n)cin>>a[i];
    // now we have k stones
    vb dp(k+1);
    // initial value of dp[i] is false
    // dp i is true if starting player wins if stones are i

    for(int stones=0;stones<=k;stones++){
        for(int i=0;i<n;i++){
            // a[i] denotes the element of array or in turn number of stones that can be picked up
            if(stones>=a[i] && !dp[stones-a[i]])dp[stones]=true;
        }
    }
    puts(dp[k] ? "First" : "Second");



return 0;
}

Measured memory_bytes: 3672