class Solution {
public:
vector<vector<string> > findLadders(string a, string b, vector<string>& A) {
unordered_set<string> s;
int n=A.size();
for(int i=0;i<n;i++){
s.insert(A[i]);
}
vector<vector<string> > final_ans;
queue<vector<string> > q;
q.push({a});
unordered_set<string> made;
while(!q.empty()){
n=q.size();
int flag=0;
unordered_set<string> made_temp;
while(n--){
vector<string> x=q.front();
q.pop();
string y=x.back();
for(int i=0;i<y.size();i++){
for(char j='a';j<='z';j++){
char z=y[i];
y[i]=j;
if(s.find(y)!=s.end() && made.find(y)==made.end()){
x.push_back(y);
if(y==b){
final_ans.push_back(x);
flag=1;
}
else q.push(x);
made_temp.insert(y);
x.pop_back();
}
y[i]=z;
}
}
}
if(flag==1) break;
for(auto it:made_temp) made.insert(it);
}
return final_ans;
}
};