#include <bits/stdc++.h>
using namespace std;
const int N = 35;
struct Node {
  bool win;
  int own, other;
  void init() {
    win = false;
    own = other = 0;
  }
  Node() {}
  Node(bool _w, int o, int _o) : win(_w), own(o), other(_o) {}
} dp[N * N * N];
map<string, int> id;
int n, val[N * N * N];
string word[N];
vector<string> sub;
bool cmp(string a, string b) {
  return (a.size() == b.size() ? a < b : a.size() < b.size());
}
Node checkmax(Node &a, Node b) {
  if (a.win != b.win) {
    if (b.win) return b;
    return a;
  }
  if (b.own > a.own)
    return b;
  else if (b.own == a.own && b.other < a.other)
    return b;
  return a;
}
void update(int i, string s) {
  if (id.find(s) == id.end()) {
    return;
  }
  int idx = id[s];
  dp[i] = checkmax(dp[i],
                   Node(!dp[idx].win, dp[idx].other + val[idx], dp[idx].own));
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> word[i];
    for (int j = 0; j < word[i].size(); j++) {
      string s = "";
      for (int k = j; k < word[i].size(); k++) {
        s += word[i][k];
        sub.push_back(s);
      }
    }
  }
  sub.push_back("");
  sort(sub.begin(), sub.end(), cmp);
  sub.resize(unique(sub.begin(), sub.end()) - sub.begin());
  for (int i = 0; i < sub.size(); i++) id[sub[i]] = i;
  for (int i = 1; i < sub.size(); i++) {
    val[i] = 0;
    for (int j = 0; j < n; j++) {
      if (word[j].find(sub[i]) != string ::npos) val[i]++;
    }
    int sum = 0, mx = 0;
    for (int j = 0; j < sub[i].size(); j++) {
      sum += sub[i][j] - 'a' + 1;
      mx = max(mx, sub[i][j] - 'a' + 1);
    }
    val[i] += sum * mx;
  }
  for (int i = sub.size() - 1; i >= 0; i--) {
    dp[i].init();
    for (char ch = 'a'; ch <= 'z'; ch++) {
      update(i, sub[i] + ch);
      update(i, ch + sub[i]);
    }
  }
  puts(dp[0].win ? "First" : "Second");
  printf("%d %d\n", dp[0].own, dp[0].other);
  return 0;
}
