#include <bits/stdc++.h>
using namespace std;
int N, M;
char str[30][31];
bool use[30 * 30 * 30][30];
map<string, int> cur;
map<string, int> cost;
map<string, int> first, second;
map<string, bool> win;
vector<string> v;
bool getwin(string s) {
  if (win.find(s) != win.end()) return win[s];
  win[s] = false;
  string ts;
  ts.clear();
  for (int i = 0; i < s.size() + 1; i++) ts.push_back('a');
  for (int i = 0; i < s.size(); i++) ts[i] = s[i];
  for (char a = 'a'; a <= 'z'; a++) {
    ts[s.size()] = a;
    if (cur.find(ts) != cur.end() && !getwin(ts)) win[s] = true;
  }
  for (int i = 0; i < s.size(); i++) ts[i + 1] = s[i];
  for (char a = 'a'; a <= 'z'; a++) {
    ts[0] = a;
    if (cur.find(ts) != cur.end() && !getwin(ts)) win[s] = true;
  }
  return win[s];
}
void get(string s) {
  if (first.find(s) != first.end()) return;
  int fi, se;
  bool w = win[s];
  fi = 0, se = 0x3f3f3f3f;
  string ts;
  ts.clear();
  for (int i = 0; i < s.size() + 1; i++) ts.push_back('a');
  for (int i = 0; i < s.size(); i++) ts[i] = s[i];
  for (char a = 'a'; a <= 'z'; a++) {
    ts[s.size()] = a;
    if (cur.find(ts) == cur.end()) continue;
    if ((w && !win[ts]) || (!w)) {
      get(ts);
      if (second[ts] + cost[ts] > fi ||
          (second[ts] + cost[ts] == fi && first[ts] < se))
        fi = second[ts] + cost[ts], se = first[ts];
    }
  }
  for (int i = 0; i < s.size(); i++) ts[i + 1] = s[i];
  for (char a = 'a'; a <= 'z'; a++) {
    ts[0] = a;
    if (cur.find(ts) == cur.end()) continue;
    if ((w && !win[ts]) || (!w)) {
      get(ts);
      if (second[ts] + cost[ts] > fi ||
          (second[ts] + cost[ts] == fi && first[ts] < se))
        fi = second[ts] + cost[ts], se = first[ts];
    }
  }
  if (se == 0x3f3f3f3f) se = 0;
  first[s] = fi, second[s] = se;
}
int main() {
  int i, j, k;
  scanf("%d", &N);
  for (i = 0; i < N; i++) scanf("%s", str[i]);
  cur.clear();
  v.clear();
  memset(use, false, sizeof(use));
  M = 0;
  for (i = 0; i < N; i++) {
    char ss[31];
    for (j = 0; str[i][j]; j++) {
      int sum = 0, max = 0;
      for (k = j; str[i][k]; k++) {
        ss[k - j] = str[i][k];
        ss[k - j + 1] = 0;
        if (cur.find(string(ss)) == cur.end())
          cur[string(ss)] = M, M++, v.push_back(string(ss));
        use[cur[string(ss)]][i] = true;
      }
    }
  }
  cost.clear();
  for (i = 0; i < M; i++) {
    int t = 0, sum = 0, max = 0;
    for (j = 0; j < v[i].size(); j++)
      sum += v[i][j] - 'a' + 1,
          max = max > v[i][j] - 'a' + 1 ? max : v[i][j] - 'a' + 1;
    t += sum * max;
    for (j = 0; j < N; j++) {
      if (use[cur[v[i]]][j]) t++;
    }
    cost[v[i]] = t;
  }
  win.clear();
  string ts;
  ts.clear();
  getwin(ts);
  if (win[ts])
    printf("First\n");
  else
    printf("Second\n");
  get(ts);
  printf("%d %d\n", first[ts], second[ts]);
  return 0;
}
