#include <bits/stdc++.h>
using namespace std;
char buff[100];
typedef struct Node {
  string s;
  int mask;
  int value;
  vector<int> next;
  Node(string s) : s(s) {
    mask = value = 0;
    next = vector<int>();
  }
} Node;
bool better(int r1, int m1, int o1, int r2, int m2, int o2) {
  if (r1 != r2) return r1 > r2;
  if (m1 != m2) return m1 > m2;
  if (o1 != o2) return o1 < o2;
  return false;
}
void run() {
  int n;
  scanf("%d", &n);
  vector<string> words;
  for (int i = (0); i < (n); ++i) {
    scanf("%s", buff);
    words.push_back(buff);
  }
  map<string, int> s2i;
  vector<Node> nodes;
  for (int i = (0); i < (n); ++i)
    for (int j = (0); j < (((int)(words[i]).size())); ++j)
      for (int k = (j - 1); k < (((int)(words[i]).size())); ++k) {
        string s = words[i].substr(j, k - j + 1);
        int at;
        if (!s2i.count(s)) {
          nodes.push_back(Node(s));
          at = s2i[s] = ((int)(nodes).size()) - 1;
        } else {
          at = s2i[s];
        }
      }
  int start = s2i[""];
  for (int i = (0); i < (n); ++i)
    for (int j = (0); j < (((int)(words[i]).size())); ++j)
      for (int k = (j - 1); k < (((int)(words[i]).size())); ++k) {
        string s = words[i].substr(j, k - j + 1);
        int at = s2i[s];
        nodes[at].mask |= 1 << i;
        if (j > 0) {
          string s1 = words[i].substr(j - 1, k - j + 2);
          nodes[at].next.push_back(s2i[s1]);
        }
        if (k + 1 < ((int)(words[i]).size())) {
          string s2 = words[i].substr(j, k - j + 2);
          nodes[at].next.push_back(s2i[s2]);
        }
      }
  for (int i = (0); i < (((int)(nodes).size())); ++i) {
    sort(nodes[i].next.begin(), nodes[i].next.end());
    nodes[i].next.erase(unique(nodes[i].next.begin(), nodes[i].next.end()),
                        nodes[i].next.end());
    int sum = 0, max = 0;
    for (int j = (0); j < (((int)(nodes[i].s).size())); ++j) {
      int x = nodes[i].s[j] - 'a' + 1;
      sum += x;
      if (x > max) max = x;
    }
    nodes[i].value = sum * max;
    for (int j = (0); j < (n); ++j)
      if (nodes[i].mask & (1 << j)) ++nodes[i].value;
  }
  vector<pair<int, int> > order;
  for (int i = (0); i < (((int)(nodes).size())); ++i)
    order.push_back(make_pair(((int)(nodes[i].s).size()), i));
  sort(order.begin(), order.end());
  vector<int> result(((int)(nodes).size()));
  vector<int> mypoints(((int)(nodes).size()));
  vector<int> opppoints(((int)(nodes).size()));
  for (int i = ((int)(order).size()) - 1; i >= 0; --i) {
    int at = order[i].second;
    result[at] = -1;
    mypoints[at] = opppoints[at] = 0;
    for (int j = (0); j < (((int)(nodes[at].next).size())); ++j) {
      int to = nodes[at].next[j];
      int nresult = -result[to], nmypoints = opppoints[to] + nodes[to].value,
          nopppoints = mypoints[to];
      if (better(nresult, nmypoints, nopppoints, result[at], mypoints[at],
                 opppoints[at]))
        result[at] = nresult, mypoints[at] = nmypoints,
        opppoints[at] = nopppoints;
    }
  }
  printf("%s\n", result[start] == +1 ? "First" : "Second");
  printf("%d %d\n", mypoints[start], opppoints[start]);
}
int main() {
  run();
  return 0;
}
