#include <bits/stdc++.h>
using namespace std;
const int MAX = 33;
struct result {
  bool winner;
  int score1, score2;
  result() {}
  result(bool w, int s1, int s2) : winner(w), score1(s1), score2(s2) {}
};
struct state {
  int score, sum_value, max_value, num;
  string s;
  vector<state *> v;
  bool solved;
  result r;
  state(const string &str) : s(str) { solved = false; }
};
int N;
int line_length;
int prefix[MAX];
int idx[MAX * MAX + MAX];
char line[MAX * MAX + MAX];
bool mark[MAX];
string d[MAX];
map<string, state *> ptr[MAX];
inline int value(char c) { return c - 'a' + 1; }
int calc_num(string &s) {
  int ret = 0;
  for (int i = 0; i < (N); ++i) mark[i] = false;
  for (int i = 0; i < (N); ++i) prefix[i] = -1;
  int j = -1;
  int length = (int)s.length();
  for (int j = -1, i = 1; i < length; ++i) {
    while (j != -1 && s[j + 1] != s[i]) j = prefix[j];
    if (s[j + 1] == s[i]) ++j;
    prefix[i] = j;
  }
  j = -1;
  for (int i = 0; i < (line_length); ++i) {
    while (j != -1 && s[j + 1] != line[i]) j = prefix[j];
    if (s[j + 1] == line[i]) ++j;
    if (j + 1 == length) {
      if (!mark[idx[i]]) ++ret;
      mark[idx[i]] = true;
      j = prefix[j];
    }
  }
  return ret;
}
void update(result &t, const result &r, int score) {
  if (t.score1 < r.score2 + score) {
    t.score1 = r.score2 + score;
    t.score2 = r.score1;
  } else if (t.score1 == r.score2 + score && t.score2 > r.score1)
    t.score2 = r.score1;
}
void run(state *s) {
  if (s->solved) return;
  if (((int)(s->v).size()) == 0) {
    s->r = result(false, 0, 0);
    return;
  }
  bool win = false;
  result rw(true, 0, 0);
  result rl(false, 0, 0);
  for (vector<state *>::iterator k = s->v.begin(); k != s->v.end(); ++k) {
    run(*k);
    if ((*k)->r.winner) {
      update(rl, (*k)->r, (*k)->score);
    } else {
      win = true;
      update(rw, (*k)->r, (*k)->score);
    }
  }
  s->solved = true;
  s->r = (win ? rw : rl);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> N;
  for (int i = 0; i < (N); ++i) cin >> d[i];
  for (int i = 0; i < (N); ++i) {
    int length = (int)d[i].length();
    for (int l = 1; l <= (length); ++l)
      for (int j = 0; j < (length - l + 1); ++j) {
        string s = d[i].substr(j, l);
        if (ptr[l].find(s) == ptr[l].end()) ptr[l][s] = new state(s);
      }
  }
  char *lptr = line;
  int *iptr = idx;
  for (int i = 0; i < (N); ++i) {
    strcpy(lptr, d[i].c_str());
    lptr += d[i].length();
    *lptr++ = '@';
    for (int j = 0; j < ((int)d[i].length()); ++j) *iptr++ = i;
    *iptr++ = -1;
  }
  line_length = strlen(line);
  for (map<string, state *>::iterator k = ptr[1].begin(); k != ptr[1].end();
       ++k) {
    k->second->sum_value = value(k->second->s[0]);
    k->second->max_value = value(k->second->s[0]);
    k->second->num = calc_num(k->second->s);
    k->second->score =
        k->second->sum_value * k->second->max_value + k->second->num;
  }
  for (int l = 2; l <= MAX; ++l)
    for (map<string, state *>::iterator s1 = ptr[l - 1].begin();
         s1 != ptr[l - 1].end(); ++s1)
      for (map<string, state *>::iterator s2 = ptr[l].begin();
           s2 != ptr[l].end(); ++s2) {
        int v = -1;
        bool f = false;
        if (s2->first.substr(0, l - 1) == s1->first)
          v = value(s2->first[s2->first.length() - 1]), f = true;
        else if (s2->first.substr(1, l - 1) == s1->first)
          v = value(s2->first[0]), f = true;
        if (f) {
          s1->second->v.push_back(s2->second);
          s2->second->sum_value = s1->second->sum_value + v;
          s2->second->max_value = max(s1->second->max_value, v);
          s2->second->num = calc_num(s2->second->s);
          s2->second->score =
              s2->second->sum_value * s2->second->max_value + s2->second->num;
        }
      }
  state *root = new state(string(""));
  for (map<string, state *>::iterator k = ptr[1].begin(); k != ptr[1].end();
       ++k)
    root->v.push_back(k->second);
  run(root);
  cout << (root->r.winner ? "First" : "Second") << endl;
  cout << root->r.score1 << " " << root->r.score2 << endl;
  return 0;
}
