# ALDS1_2_C.
# バブルソートと選択ソートの安定性。
from math import sqrt, floor

class card:
    def __init__(self, _str):
        # S3とかH8をもとに初期化。
        self.kind = _str  # 出力用。
        self.suit = _str[0]
        self.value = int(_str[1])

def cardinput():
    # カードの配列からオブジェクトの配列を生成。
    a = input().split()
    cards = []
    for i in range(len(a)):
        cards.append(card(a[i]))
    return cards

def show(a):
    # 配列の中身を出力する。
    _str = ""
    for i in range(len(a) - 1):
        _str += a[i].kind + " "
    _str += a[len(a) - 1].kind
    print(_str)

def bubble_sort(a):
    # aをバブルソートする(交換回数をreturnする)。
    count = 0
    for i in range(1, len(a)):
        k = i - 1
        while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
    return count

def selection_sort(a):
    # 選択ソート。その番号以降の最小値を順繰りにもってくる。
    # 交換回数は少ないが比較回数の関係で結局O(n^2)かかる。
    count = 0
    for i in range(len(a)):
        # a[i]からa[len(a) - 1]のうちa[j]が最小っていうjを取る。
        # このときiとjが違うならカウントする。
        # というかa[i]とa[j]が違う時カウントでしたね。
        minj = i
        for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
        if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
    return count

def main():
    N = int(input())
    cards = cardinput()
    # バブルソートは安定。同じvalueなら団子のようにくっつくから。
    # 選択ソートは交換が飛び越えるので不安定。よって、
    # バブルの結果と比較すれば安定か不安定かが分かる。
    _copy = [cards[i] for i in range(N)]

    bubble_sort(cards)
    selection_sort(_copy)

    show(cards)
    print("Stable")
    show(_copy)

    is_stable = True
    for i in range(N):
        for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
    if is_stable: print("Stable")
    else: print("Not stable")

if __name__ == "__main__":
    main() from math import sqrt, floor class card:
    def __init__(self, _str):
        # S3とかH8をもとに初期化。
        self.kind = _str  # 出力用。
        self.suit = _str[0]
        self.value = int(_str[1]) card def __init__(self, _str):
        # S3とかH8をもとに初期化。
        self.kind = _str  # 出力用。
        self.suit = _str[0]
        self.value = int(_str[1]) __init__ self.kind = _str self.kind self kind _str self.suit = _str[0] self.suit self suit _str[0] _str 0 self.value = int(_str[1]) self.value self value int(_str[1]) int _str[1] _str 1 self self _str _str def cardinput():
    # カードの配列からオブジェクトの配列を生成。
    a = input().split()
    cards = []
    for i in range(len(a)):
        cards.append(card(a[i]))
    return cards cardinput a = input().split() a input().split() ().split () input split cards = [] cards [] for i in range(len(a)):
        cards.append(card(a[i]))
     i range(len(a)) range len(a) len a cards.append(card(a[i])) cards.append cards append card(a[i]) card a[i] a i return cards cards def show(a):
    # 配列の中身を出力する。
    _str = ""
    for i in range(len(a) - 1):
        _str += a[i].kind + " "
    _str += a[len(a) - 1].kind
    print(_str) show _str = "" _str "" for i in range(len(a) - 1):
        _str += a[i].kind + " "
     i range(len(a) - 1) range len(a) - 1 len(a) len a 1 _str += a[i].kind + " " _str a[i].kind + " " a[i].kind [i] a i kind " " _str += a[len(a) - 1].kind _str a[len(a) - 1].kind [len(a) - 1] a len(a) - 1 len(a) len a 1 kind print(_str) print _str a a def bubble_sort(a):
    # aをバブルソートする(交換回数をreturnする)。
    count = 0
    for i in range(1, len(a)):
        k = i - 1
        while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
    return count bubble_sort count = 0 count 0 for i in range(1, len(a)):
        k = i - 1
        while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
     i range(1, len(a)) range 1 len(a) len a k = i - 1 k i - 1 i 1 while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
     k >= 0 k 0 if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
             a[k].value > a[k + 1].value a[k].value [k] a k value a[k + 1].value [k + 1] a k + 1 k 1 value a[k], a[k + 1] = a[k + 1], a[k] a[k] a k a[k + 1] a k + 1 k 1 a[k + 1] a k + 1 k 1 a[k] a k count += 1 count 1 k -= 1 k 1 return count count a a def selection_sort(a):
    # 選択ソート。その番号以降の最小値を順繰りにもってくる。
    # 交換回数は少ないが比較回数の関係で結局O(n^2)かかる。
    count = 0
    for i in range(len(a)):
        # a[i]からa[len(a) - 1]のうちa[j]が最小っていうjを取る。
        # このときiとjが違うならカウントする。
        # というかa[i]とa[j]が違う時カウントでしたね。
        minj = i
        for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
        if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
    return count selection_sort count = 0 count 0 for i in range(len(a)):
        # a[i]からa[len(a) - 1]のうちa[j]が最小っていうjを取る。
        # このときiとjが違うならカウントする。
        # というかa[i]とa[j]が違う時カウントでしたね。
        minj = i
        for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
        if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
     i range(len(a)) range len(a) len a minj = i minj i for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
         j range(i, len(a)) range i len(a) len a if a[j].value < a[minj].value: minj = j
         a[j].value < a[minj].value a[j].value [j] a j value a[minj].value [minj] a minj value if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
     a[i].value > a[minj].value a[i].value [i] a i value a[minj].value [minj] a minj value return count count a a def main():
    N = int(input())
    cards = cardinput()
    # バブルソートは安定。同じvalueなら団子のようにくっつくから。
    # 選択ソートは交換が飛び越えるので不安定。よって、
    # バブルの結果と比較すれば安定か不安定かが分かる。
    _copy = [cards[i] for i in range(N)]

    bubble_sort(cards)
    selection_sort(_copy)

    show(cards)
    print("Stable")
    show(_copy)

    is_stable = True
    for i in range(N):
        for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
    if is_stable: print("Stable")
    else: print("Not stable") main N = int(input()) N int(input()) int input() input cards = cardinput() cards cardinput() cardinput cards[i] for i in range(N) for i in range(N) i range(N) range N for i in range(N) cards[i] cards i _copy = [cards[i] for i in range(N)] _copy [cards[i] for i in range(N)] bubble_sort(cards) bubble_sort cards selection_sort(_copy) selection_sort _copy show(cards) show cards print("Stable") print "Stable" show(_copy) show _copy is_stable = True is_stable True for i in range(N):
        for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
     i range(N) range N for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
     j range(i + 1, N) range i + 1 i 1 N if _copy[i].value != _copy[j].value: continue
             _copy[i].value != _copy[j].value _copy[i].value [i] _copy i value _copy[j].value [j] _copy j value if _copy[i].suit != cards[i].suit: is_stable = False; break
     _copy[i].suit != cards[i].suit _copy[i].suit [i] _copy i suit cards[i].suit [i] cards i suit if is_stable: print("Stable")
    else: print("Not stable") is_stable if __name__ == "__main__":
    main() __name__ == "__main__" __name__ "__main__" main() main def show(a):
    # 配列の中身を出力する。
    _str = ""
    for i in range(len(a) - 1):
        _str += a[i].kind + " "
    _str += a[len(a) - 1].kind
    print(_str) def show(a):
    # 配列の中身を出力する。
    _str = ""
    for i in range(len(a) - 1):
        _str += a[i].kind + " "
    _str += a[len(a) - 1].kind
    print(_str) show def selection_sort(a):
    # 選択ソート。その番号以降の最小値を順繰りにもってくる。
    # 交換回数は少ないが比較回数の関係で結局O(n^2)かかる。
    count = 0
    for i in range(len(a)):
        # a[i]からa[len(a) - 1]のうちa[j]が最小っていうjを取る。
        # このときiとjが違うならカウントする。
        # というかa[i]とa[j]が違う時カウントでしたね。
        minj = i
        for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
        if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
    return count def selection_sort(a):
    # 選択ソート。その番号以降の最小値を順繰りにもってくる。
    # 交換回数は少ないが比較回数の関係で結局O(n^2)かかる。
    count = 0
    for i in range(len(a)):
        # a[i]からa[len(a) - 1]のうちa[j]が最小っていうjを取る。
        # このときiとjが違うならカウントする。
        # というかa[i]とa[j]が違う時カウントでしたね。
        minj = i
        for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
        if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
    return count selection_sort def bubble_sort(a):
    # aをバブルソートする(交換回数をreturnする)。
    count = 0
    for i in range(1, len(a)):
        k = i - 1
        while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
    return count def bubble_sort(a):
    # aをバブルソートする(交換回数をreturnする)。
    count = 0
    for i in range(1, len(a)):
        k = i - 1
        while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
    return count bubble_sort def cardinput():
    # カードの配列からオブジェクトの配列を生成。
    a = input().split()
    cards = []
    for i in range(len(a)):
        cards.append(card(a[i]))
    return cards def cardinput():
    # カードの配列からオブジェクトの配列を生成。
    a = input().split()
    cards = []
    for i in range(len(a)):
        cards.append(card(a[i]))
    return cards cardinput def main():
    N = int(input())
    cards = cardinput()
    # バブルソートは安定。同じvalueなら団子のようにくっつくから。
    # 選択ソートは交換が飛び越えるので不安定。よって、
    # バブルの結果と比較すれば安定か不安定かが分かる。
    _copy = [cards[i] for i in range(N)]

    bubble_sort(cards)
    selection_sort(_copy)

    show(cards)
    print("Stable")
    show(_copy)

    is_stable = True
    for i in range(N):
        for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
    if is_stable: print("Stable")
    else: print("Not stable") def main():
    N = int(input())
    cards = cardinput()
    # バブルソートは安定。同じvalueなら団子のようにくっつくから。
    # 選択ソートは交換が飛び越えるので不安定。よって、
    # バブルの結果と比較すれば安定か不安定かが分かる。
    _copy = [cards[i] for i in range(N)]

    bubble_sort(cards)
    selection_sort(_copy)

    show(cards)
    print("Stable")
    show(_copy)

    is_stable = True
    for i in range(N):
        for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
    if is_stable: print("Stable")
    else: print("Not stable") main class card:
    def __init__(self, _str):
        # S3とかH8をもとに初期化。
        self.kind = _str  # 出力用。
        self.suit = _str[0]
        self.value = int(_str[1]) class card:
    def __init__(self, _str):
        # S3とかH8をもとに初期化。
        self.kind = _str  # 出力用。
        self.suit = _str[0]
        self.value = int(_str[1]) card
# ALDS1_2_C.
# バブルソートと選択ソートの安定性。
from math import sqrt, floor

class card:
    def __init__(self, _str):
        # S3とかH8をもとに初期化。
        self.kind = _str  # 出力用。
        self.suit = _str[0]
        self.value = int(_str[1])

def cardinput():
    # カードの配列からオブジェクトの配列を生成。
    a = input().split()
    cards = []
    for i in range(len(a)):
        cards.append(card(a[i]))
    return cards

def show(a):
    # 配列の中身を出力する。
    _str = ""
    for i in range(len(a) - 1):
        _str += a[i].kind + " "
    _str += a[len(a) - 1].kind
    print(_str)

def bubble_sort(a):
    # aをバブルソートする(交換回数をreturnする)。
    count = 0
    for i in range(1, len(a)):
        k = i - 1
        while k >= 0:
            # a[i]を前の数と交換していき、前の方が小さかったら止める。
            if a[k].value > a[k + 1].value:
                a[k], a[k + 1] = a[k + 1], a[k]
                count += 1
            else: break
            k -= 1
    return count

def selection_sort(a):
    # 選択ソート。その番号以降の最小値を順繰りにもってくる。
    # 交換回数は少ないが比較回数の関係で結局O(n^2)かかる。
    count = 0
    for i in range(len(a)):
        # a[i]からa[len(a) - 1]のうちa[j]が最小っていうjを取る。
        # このときiとjが違うならカウントする。
        # というかa[i]とa[j]が違う時カウントでしたね。
        minj = i
        for j in range(i, len(a)):
            if a[j].value < a[minj].value: minj = j
        if a[i].value > a[minj].value: count += 1; a[i], a[minj] = a[minj], a[i]
    return count

def main():
    N = int(input())
    cards = cardinput()
    # バブルソートは安定。同じvalueなら団子のようにくっつくから。
    # 選択ソートは交換が飛び越えるので不安定。よって、
    # バブルの結果と比較すれば安定か不安定かが分かる。
    _copy = [cards[i] for i in range(N)]

    bubble_sort(cards)
    selection_sort(_copy)

    show(cards)
    print("Stable")
    show(_copy)

    is_stable = True
    for i in range(N):
        for j in range(i + 1, N):
            if _copy[i].value != _copy[j].value: continue
            if _copy[i].suit != cards[i].suit: is_stable = False; break
    if is_stable: print("Stable")
    else: print("Not stable")

if __name__ == "__main__":
    main()
