#include <iostream>
#include <stdlib.h>
using namespace std;

void gcd(int a, int b) {
    int c;
    c = a % b;
    while (c != 0) {
        a = b;
        b = c;
        c = a % b;
    }

    cout << b;
    return;
}

// 冒泡排序  时间复杂度太大了 O(n^2)
void bubbleSort(int data[], int n) {
    int temp;  // 暂存数组数据,交换数据
    for (int i = 0; i < n - 1; i++) { // n-1 轮排序
        bool flag = false;  // 一轮试探无乱序,直接跳过
        for (int j = n - 1; j > i; j--) {
            if (data[j - 1] > data[j]) { // 最多到i=1, i=0越界
                temp = data[j];
                data[j] = data[j - 1];
                data[j - 1] = temp;
                flag = true;
            }
        }
        if (!flag) {
            return;
        }
    }
}

// 快速排序
int partition(int data[], int low, int high) {
    int pivot, temp;
    pivot = data[low]; // 最低元素作为枢轴元素
    while (low < high) {
        while ( low < high && data[high] >= pivot) {
            high--;
        }
        data[low] = data[high];
        while ( low < high && data[low] <= pivot) {
            low++;
        }
        data[high] = data[low];
    }
    data[low] = pivot; // 枢轴元素回归到正确的地方
    return low; // 返回已经排好序元素的下标
}

// 参数 不定大小 数组
void quickSort(int data[], int low, int high) {
    // 递归
    if (low < high) { // 跳出递归的条件
        int pivotpos = partition(data, low, high); // 划分数组 前半段 后半段
        quickSort(data, low, pivotpos - 1); // 前半段
        quickSort(data, pivotpos + 1, high); // 后半段
    }
}

int main() {
    int a, b, n;
    int* data;
    while (cin >> n) {
        data = (int*)malloc(n * sizeof(int));
        for (int i = 0; i < n; i++) {
            cin >> data[i];
        }
        // bubbleSort(data,n);  // 时间复杂度太高
        quickSort(data, 0, n - 1); // 快排 传递 int型指针 或者 int数组
        cout << data[0] << " " << data[n - 1] << " ";
        gcd(data[n - 1], data[0]);
        cout << endl;
        free(data);
    }
    return 0;
}