#深度优先搜索
#回溯
#include<bits/stdc++.h>
using namespace std;
vector<string> result;//二维,存每一次排列后的字符串
string path;//一维,排列后的字符串
int m=0;//统计排列总数
void dfs(string& nums,vector<bool>& used){//used标记字符是否已经用过
if(path.size()==nums.size()){//终止条件
result.push_back(path);
m++;
return ;
}
for(int i=0;i<nums.size();i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false){//树层上去重,枝层可以相同
continue;//不是break
}
if (used[i]==false) {
used[i]=true;
path.push_back(nums[i]);
dfs(nums,used);//继续分支
path.pop_back();//回溯
used[i]=false;//回溯
}
}
}
int main(){
int n;
cin>>n;
cin.ignore();
string nums;
getline(cin,nums);
sort(nums.begin(),nums.end());//必须排序
vector<bool> used(nums.size(),false);//初始used都为false
dfs(nums,used);
sort(result.begin(),result.end());//对result中的字符串进行排序
for(int i=0;i<m;i++){
cout<<result[i]<<'\n';
}
cout<<m<<'\n';
return 0;
}