#include <bits/stdc++.h>
using namespace std;
int n, k;
struct node {
  int v;
  bool go;
} a[200];
bool cmp(node a, node b) { return a.v < b.v; }
vector<int> qq[120];
set<vector<int> > g;
int main() {
  cin >> n >> k;
  for (int i = 1; i <= n; i++) cin >> a[i].v;
  double ma = -1, mi = 1e18;
  int q;
  int c = n / k;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int t;
    for (int j = 0; j < c; j++) scanf("%d", &t), qq[i].push_back(t);
    sort(qq[i].begin(), qq[i].end());
  }
  for (int i = 0; i < q; i++) g.insert(qq[i]);
  int scnt = g.size();
  set<vector<int> >::iterator p;
  for (p = g.begin(); p != g.end(); p++) {
    double tot = 0;
    for (int j = 0; j < c; j++) {
      int t = (*p)[j];
      tot += a[t].v;
      a[t].go = 1;
    }
    ma = max(ma, tot * 1.0 / c);
    mi = min(mi, tot * 1.0 / c);
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++)
    if (!a[i].go) {
      a[cnt++].v = a[i].v;
    }
  if (k > scnt && cnt >= c) {
    sort(a, a + cnt, cmp);
    double tot = 0;
    for (int i = 0; i < c; i++) tot += a[i].v;
    mi = min(mi, tot * 1.0 / c);
    tot = 0;
    for (int i = cnt - 1; i >= cnt - c; i--) tot += a[i].v;
    ma = max(ma, tot * 1.0 / c);
  }
  printf("%.11lf %.11lf\n", mi, ma);
  return 0;
}
