#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

template<typename T1,typename T2>
istream&operator>>(istream&in,pair<T1,T2>&a){
    return in>>a.first>>a.second;
}
template<typename T1,typename T2>
ostream&operator<<(ostream&out,const pair<T1,T2>&a){
    return out<<a.first<<' '<<a.second<<'\n';
}
template<typename T>
istream&operator>>(istream&in,vector<T>&a){
    for (auto &i:a)in>>i;
    return in;
}
template<typename T>
ostream&operator<<(ostream&out,const vector<T>&a){
    for (const auto &i:a)out<<i<<' ';
    return out;
}
template<typename T>
ostream&operator<<(ostream&out,const vector<vector<T>>&a){
    for (const auto &i:a)out<<i<<'\n';
    return out;
}
typedef long long ll;
const int inf =1e9+7;
namespace Min{
    enum Query{
        Add,
        Set
    };
    template<typename T>
    struct Data{
        T mn{};
        int ind{};
        T d{0};
        Query q{Add};
        Data(int mn={}, int ind={}):mn(mn),ind(ind){}
        Data (const vector<T>&a, int tl):Data(a[tl],tl){}
        Data operator+(const Data&other)const {
            if (mn<=other.mn)return *this;
            return other;
        }
    };
    template<typename T>
    struct SgTree{
        int n;
        vector<Data<T>> d;
        SgTree(int n={}):n(n){
            d.resize(4*n);
        }
        SgTree(const vector<T>&a):SgTree(a.size()){
            build(0,0,n,a);
        }
        Data<T>&build(int v, int tl, int tr, const vector<T>&a){
            if (tl+1==tr)return d[v]={a,tl};
            int tm=(tl+tr)/2;
            return d[v]=build(2*v+1,tl,tm,a)+build(2*v+2,tm,tr,a);
        }
        Data<T> get(int ql, int qr){
            return get(0,0,n,ql,qr);
        }
        Data<T> get(int t, int tl, int tr, int ql, int qr){
            push(t,tl,tr);
            if (tl==ql && tr==qr)return d[t];
            int tm=(tl+tr)/2;
            if (qr<=tm)return get(2*t+1,tl,tm,ql,qr);
            if (ql>=tm)return get(2*t+2,tm,tr,ql,qr);
            return get(2*t+1,tl,tm,ql,tm)+get(2*t+2,tm,tr,tm,qr);
        }
        void push(int t, int tl, int tr){
        }
        void update(int ql, int qr, T d, Query q){
            update(0,0,n,ql,qr,d,q);
        }
        void update(int t, int tl, int tr, int ql,int qr, T d, Query q){
            push(t, tl, tr);
            if (qr<=tl || tr<=ql)return;
            if (tl<=ql && qr<=tr){
                switch (q){
                    case(Set):
                        d[t].d=d;
                        d[t].q=Set;
                        break;
                    case (Add):
                        d[t].d+=d;
                }
                push(t,tl,tr);
                return;
            }
        }
    };
}
struct A{
    int a;
    int b;
    A(int a={}, int b={}):a(a),b(b){}
    bool operator <(const A&other)const{
        return min(a,b)<min(other.a,other.b);
    }
};
void print(bool x){
    if (x)cout<<"First\n";
    else cout<<"Second\n";
}
struct solve{
    int n,m;
    vector<int>a;
    vector<int>b;
    vector<int>c;
    set<A>st;
    solve(){
        cin>>n>>m;
        a.resize(n);
        b.resize(n);
        c.resize(m);
        cin>>a>>b>>c;
        for (int i=0;i<n;i++)st.emplace(a[i],b[i]);
        for (int i=0;i<m;i++)st.emplace(inf,c[i]);
        int k=n+m;
        vector<bool>pos(k+1,false);
        auto it=st.end();
        for (int i=k-1;i>=0;i--){
            it--;
            auto [x,y]=*it;
            if (x<y)pos[i]=true;
            else pos[i]=1^pos[i+1];
        }
        print(pos[0]);
    }
};
int main()
{
    int t=1;
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    while(t--)solve();
}
