#include <bits/stdc++.h>
using namespace std;
map<int, int> vis;
const int MAX = 100100;
int m, n, a[MAX], is[MAX * 2];
long long inv(long long a, long long m) {
  if (a == 1) return 1;
  return inv(m % a, m) * (m - m / a) % m;
}
int main(void) {
  scanf("%d%d", &m, &n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  if (n == 1 || n == m) {
    printf("%d %d\n", a[0], 1);
    return 0;
  }
  int on = n;
  if (2 * n > m) {
    n = m - n;
    for (int i = 0; i < on; i++) is[a[i]] = 1;
    for (int i = 0, j = 0; i < m; i++)
      if (is[i] == 0) a[j++] = i;
    if (n == 1) {
      printf("%d %d\n", a[0] + 1, 1);
      return 0;
    }
  } else
    sort(a, a + n);
  vis.clear();
  int d = a[1] - a[0];
  vis[a[1]] = 1;
  int cnt = 1;
  for (int i = 1; i < n; i++) {
    if (binary_search(a, a + n, (d + a[i]) % m)) {
      if (vis.find((d + a[i]) % m) != vis.end()) break;
      vis[(d + a[i]) % m] = 1;
      cnt++;
    }
  }
  d = (long long)d * ((inv(n - cnt, m) + m) % m) % m;
  vis.clear();
  vis[a[0]] = 1;
  int f = 0, b = 0;
  for (int i = 1; i < n; i++) {
    if (binary_search(a, a + n, (a[0] + (long long)d * i) % m) &&
        vis.find((a[0] + (long long)d * i) % m) == vis.end()) {
      vis[(a[0] + (long long)d * i) % m] = 1;
      f++;
    } else
      break;
  }
  for (int i = 1; i < n; i++) {
    if (binary_search(a, a + n, (a[0] + (long long)(m - d) * i) % m) &&
        vis.find((a[0] + (long long)(m - d) * i) % m) == vis.end()) {
      vis[(a[0] + (long long)(m - d) * i) % m] = 1;
      b++;
    } else
      break;
  }
  if (f + b + 1 == n) {
    int fir = (a[0] + (long long)(m - d) * b) % m;
    if (on * 2 > m) fir = (a[0] + (long long)d * f + d) % m;
    printf("%d %d\n", fir, d);
    return 0;
  }
  printf("-1\n");
  return 0;
}
