#include <bits/stdc++.h>
using namespace std;
template <typename TP>
inline bool rd(TP& r) {
  r = 0;
  char tmp = getchar();
  while (tmp < '0' || tmp > '9') {
    if (tmp == EOF) return 0;
    tmp = getchar();
  }
  while ('0' <= tmp && tmp <= '9') {
    r = (r << 3) + (r << 1) + tmp - '0';
    tmp = getchar();
  }
  return 1;
}
long long m, n;
long long power(long long ori, long long t) {
  long long re = 1;
  while (t) {
    if (t & 1) re = re * ori % m;
    t >>= 1;
    ori = ori * ori % m;
  }
  return re;
}
long long nin, ni2, ni6;
long long a[100100];
long long d, a1, p1;
bool vis[100100];
long long sm, sm2;
int main() {
  rd(m), rd(n);
  nin = power(n, m - 2);
  ni2 = power(2, m - 2);
  ni6 = power(6, m - 2);
  for (int i = 1; i <= n; i++) {
    rd(a[i]);
    sm = (sm + a[i]) % m;
    sm2 = (sm2 + a[i] * a[i] % m) % m;
  }
  if (n == 1) {
    printf("%I64d 1\n", a[1]);
    return 0;
  }
  sort(a + 1, a + n + 1);
  long long now, anow;
  bool fail;
  for (int i = 2; i <= n; i++) {
    d = a[i] - a[1];
    a1 = (sm - (n - 1) * n / 2 * d % m + m) % m * nin % m;
    p1 = lower_bound(a + 1, a + n + 1, a1) - a;
    if (a[p1] != a1) continue;
    if ((a1 * a1 % m * n % m + a1 * d % m * (n - 1) % m * n % m +
         d * d % m * n % m * (n - 1) % m * (2 * n - 1) % m * ni6) %
            m ==
        sm2) {
      memset(vis, 0, sizeof(vis));
      now = p1;
      while (1) {
        if (vis[now]) break;
        vis[now] = 1;
        anow = (a[now] + d) % m;
        now = lower_bound(a + 1, a + n + 1, anow) - a;
        if (a[now] != anow) break;
      }
      fail = 0;
      for (int i = 1; i <= n && !fail; i++)
        if (!vis[i]) fail = 1;
      if (!fail) {
        printf("%I64d %I64d\n", a1, d);
        return 0;
      }
    }
  }
  printf("-1\n");
  return 0;
}
