#include<stdio.h>
#include<stdlib.h>
struct N{
    int d;
    struct N* next;
};
int freeTheList(struct N* head){
    if(head == NULL){
        return 1;
    }
    struct N* cr = head->next;
    while(cr != head){
        struct N* temp = cr;
        cr = cr->next;
        free(temp);
    }
    free(head);
    return 1;
}
int main(){
    int n, i, v, temp_d;
    struct N *head = NULL, *tail = NULL;
    if(scanf("%d", &n) != 1){
        printf("Invalid input");
        return 1;
    }
    for(i=0; i<n; i++){
        if(scanf("%d", &v) != 1){
            printf("Invalid input");
            freeTheList(head);
            return 1;
        }
        struct N* newNode = (struct N*)malloc(sizeof(struct N));
        newNode->d = v;
        if(head == NULL){
            head = newNode;
            newNode->next = head;
            tail = head;
        }else{
            tail->next = newNode;
            newNode->next = head;
            tail = newNode;
        }
    }
    if(head != NULL && n>1){
        struct N *cr_node;
        for(i=0; i<n-1; i++){
            cr_node = head;
            for(j=0; j<n-1-i; j++){
                if(cr_node->d > inner_node->d){
                    temp_d = cr_node->d;
                    cr_node->d = inner_node->d;
                    inner_node->d = temp_d;
                }
                inner_node = inner_node->next;
            }
            cr_node = cr_node->next;
        }while(cr_node != head);
    }
    if(head != NULL){
        struct N* temp = head;
        do{
            printf("%d", temp->d);
            temp = temp->next;
            if(temp != head){
                printf(" ");
            }
        }while(temp != head);
        printf("\n");
        printf("Smallest: %d\n", head->d);
        printf("Largest: %d\n", tail->d);
    }
    freeTheList(head);
    return 0;
}