Problem: Vasya is about to take his first university exam in about several minutes. And it's not just some ordinary exam, it's on mathematical analysis. Of course, right now Vasya can only think of one thing: what the result of his talk with the examiner will be...

To prepare for the exam, one has to study proofs of n theorems. It is known that there will be k examination cards on the exam and each card contains <image> distinct theorems. Besides, no theorem is mentioned in more than one card (that is, <image> theorems won't be mentioned in any card). During the exam several students may get the same card.

We do not know the exact way theorems are distributed by cards, however the students that took the exam before Vasya told him what theorems their cards contained. Vasya evaluates his level of proficiency in the i-th theorem by some number ai. The level of proficiency in some card is the average of the levels of proficiency in the theorems that are included in the card. Now Vasya wants to know the minimally and maximally possible levels of his proficiency in the card he gets on the exam. Vasya wants to determine it by the data he has collected from other students. Unfortunately, Vasya has no time left to do the math and he asked you to help him.

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 100) — the number of theorems and the number of cards correspondingly. The second line contains n integers ai (0 ≤ ai ≤ 100), the i-th number (1 ≤ i ≤ n) corresponds to Vasya's proficiency in the i-th theorem.

The third line contains number q (0 ≤ q ≤ 100) — the number of people that have taken the exam before Vasya. Each of the following q lines contains the description of a student's card: <image> integers from 1 to n inclusive. They are the numbers of theorems included in the card in the order in which they are enumerated in the input data. The numbers are given in an arbitrary order. It is guaranteed that the given cards are valid (that is, that all theorems in one card are different and that different people get cards that either don't contain the same theorems or coincide up to the theorems' permutation).

Output

Print two real numbers, representing Vasya's minimum and maximum proficiency in the card he will get on the exam. The absolute or relative error should not exceed 10 - 6.

Examples

Input

7 3
7 15 0 19 10 5 12
2
1 6
7 4


Output

5.0000000000 15.5000000000

Input

4 2
10 8 1 17
2
2 3
3 2


Output

4.5000000000 13.5000000000

Note

Let's analyze the first sample. Vasya's proficiency in the cards whose content he already knows equals 6 and 15.5 correspondingly. The three theorems that are left are only enough to make one exam card. If we consider all possible variants of theorems included in the card we can see that in the best case scenario Vasya gets the card that contains theorems 4 and 7 (his proficiency would equal 15.5) and in the worst case scenario he gets theorems 3 and 5 (his proficiency would equal 5).

The ⌊ x⌋ operation denotes taking integer part of real number x (rounding down).

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;


public final class Solution {
  public static void main(String[] args) throws Exception {
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

//    BufferedReader input = new BufferedReader(new FileReader("input.txt"));
//    BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));

    String[] nk = input.readLine().split(" ");
    int n = Integer.parseInt(nk[0]);
    int k = Integer.parseInt(nk[1]);
    String[] knowStr = input.readLine().split(" ");
    int[] knowledge = new int[n];
    for (int i = 0; i < n; i++) {
      knowledge[i] = Integer.parseInt(knowStr[i]);
    }
    int q = Integer.parseInt(input.readLine());
    int tPerT = n / k;
    Double min = null;
    Double max = null;
    Set<Integer> knownTheoremIdxs = new HashSet<>();
    for (int i = 0; i < q; i++) {
      String[] knownTicket = input.readLine().split(" ");
      int sum = 0;
      for (int j = 0; j < tPerT; j++) {
        int tIdx = Integer.parseInt(knownTicket[j]) - 1;
        sum += knowledge[tIdx];
        knownTheoremIdxs.add(tIdx);
      }
      double avg = (double) sum / (double) tPerT;
      if (min == null || avg < min) {
        min = avg;
      }
      if (max == null || avg > max) {
        max = avg;
      }
    }



//    if (knownTheoremIdxs.size() == k) {
//      System.out.println(min + " " + max);
//      return;
//    }

    List<Integer> notKnownThIdxs1 = new ArrayList<>(n); // low
    List<Integer> notKnownThIdxs2 = new ArrayList<>(n); // high
    for (int i = 0; i < n; i++) {
      if (!knownTheoremIdxs.contains(i)) {
        notKnownThIdxs1.add(i);
        notKnownThIdxs2.add(i);
      }
    }

    if (n % k == notKnownThIdxs1.size()) {
      System.out.println(min + " " + max);
      return;
    }

    if (notKnownThIdxs1.size() < tPerT) {
      System.out.println(min + " " + max);
      return;
    } else if (notKnownThIdxs1.size() == tPerT) {
      int sum = 0;
      for (int tIdx: notKnownThIdxs1) {
        sum += knowledge[tIdx];
      }
      double avg = (double) sum / (double) tPerT;
      double minLocal = min == null ? avg : Math.min(avg, min);
      double maxLocal = max == null ? avg : Math.max(avg, max);
      System.out.println(minLocal + " " + maxLocal);
      return;
    }

    rearrange(notKnownThIdxs1, knowledge, tPerT, 0, notKnownThIdxs1.size() - 1);
    rearrange(notKnownThIdxs2, knowledge, notKnownThIdxs2.size() - 1 - tPerT, 0, notKnownThIdxs2.size() - 1);

    int lowSum = 0;
    for (int i = 0; i < tPerT; i++) {
      lowSum += knowledge[notKnownThIdxs1.get(i)];
    }
    int highSum = 0;
    for (int i = 0; i < tPerT; i++) {
      highSum += knowledge[notKnownThIdxs2.get(notKnownThIdxs2.size() - 1 - i)];
    }

    double lowAvg = (double) lowSum / (double) tPerT;
    double highAvg = (double) highSum / (double) tPerT;

    if (min != null && min < lowAvg) {
      lowAvg = min;
    }
    if (max != null && max > highAvg) {
      highAvg = max;
    }

    System.out.println(lowAvg + " " + highAvg);
  }

  static void rearrange(List<Integer> idxs, int[] knowledge, int pivotIndex, int left, int right) {
    if (left == right) {
      return;
    }
    int fPivotIndex = left;
    for (int i = left + 1; i <= right; i++) {
      if (knowledge[idxs.get(i)] < knowledge[idxs.get(left)]) {
        fPivotIndex++;
        swap(idxs, i, fPivotIndex);
      }
    }
    swap(idxs, fPivotIndex, left);
    if (fPivotIndex == pivotIndex) {
      return;
    } else if (fPivotIndex < pivotIndex) {
      rearrange(idxs, knowledge, pivotIndex, fPivotIndex + 1, right);
    } else {
      rearrange(idxs, knowledge, pivotIndex, left, fPivotIndex);
    }
  }

  static void swap(List<Integer> idxs, int i, int j) {
    int tmp = idxs.get(i);
    idxs.set(i, idxs.get(j));
    idxs.set(j, tmp);
  }
}