#include <bits/stdc++.h>
int compare(const void *a, const void *b) {
  int ia = *(int *)a;
  int ib = *(int *)b;
  return ia - ib;
}
int xy[2];
int gcd_(int a, int b) {
  if (b == 0) {
    xy[0] = 1;
    xy[1] = 0;
    return a;
  } else {
    int g = gcd_(b, a % b);
    int t = xy[0] - a / b * xy[1];
    xy[0] = xy[1];
    xy[1] = t;
    return g;
  }
}
int contains(int *aa, int n, int x) {
  int lower = -1, upper = n;
  while (upper - lower > 1) {
    int i = (lower + upper) / 2;
    if (aa[i] <= x)
      lower = i;
    else
      upper = i;
  }
  return lower >= 0 && aa[lower] == x;
}
int main() {
  static int aa[100000];
  int m, n, n_, i, j, b, yes;
  long long t1, t2, s1, s2, d, a;
  scanf("%d%d", &m, &n);
  for (i = 0; i < n; i++) scanf("%d", &aa[i]);
  if (n == 1) {
    printf("%d 0\n", aa[0]);
    return 0;
  }
  qsort(aa, n, sizeof *aa, compare);
  gcd_(n, m);
  n_ = (xy[0] + m) % m;
  t1 = (long long)n * (n - 1) / 2 % m;
  t2 = (long long)n * (n - 1) * (2 * n - 1) / 6 % m;
  s1 = s2 = 0;
  for (i = 0; i < n; i++) {
    a = aa[i];
    s1 = (s1 + a) % m;
    s2 = (s2 + a * a) % m;
  }
  for (i = 1; i < n; i++) {
    d = (aa[i] - aa[0] + m) % m;
    a = ((s1 - d * t1) % m * n_ % m + m) % m;
    if ((a * a % m * n + 2 * a * d % m * t1 + d * d % m * t2) % m != s2)
      continue;
    yes = 1;
    for (j = 0, b = a; j < n; j++, b = (b + d) % m)
      if (!contains(aa, n, b)) {
        yes = 0;
        break;
      }
    if (yes) {
      printf("%lld %lld\n", a, d);
      return 0;
    }
  }
  printf("-1\n");
  return 0;
}
