using namespace std;
#include <iostream>
#include <string>

using namespace std;
class Token {
   private:
      string type;
      string val;
   public:
      string getType() {return type;}
      string getVal() {return val;}
      void setType(string t) {type = t;}
      void setVal(string v) {val = v;}
      string toString () { return "[" + type + "," + val + "]"; }
}; //End of Token Class


int index(char s[], char ch) {
  int i=0;
  int len = strlen(s);
  int ans = -1;
  while (i < len && ch != s[i]) i++;
  if (i < len) ans = i;
  // cout << "Returning ans= " << ans << endl;
  return ans;
} 

Token TokenONE(string &s) {
   cout << "Matching \"" << s << "\" in TokenONE";
    char alphabet[] = "ab";
    string name="TokenONE";
    int state = 0;
    char ch ;
    int length = s.length();
    Token t;
    t.setType("");
    t.setVal(""); 
    int pos = 0;
    while (pos < length && (index(alphabet,ch=s[pos]) >= 0 )  ){ 
      switch(state) {
        case 1:
        if (ch == 'a') state = 2;
        if (ch == 'b') state = 1;
       break;
       case 2:
        if (ch == 'a') state = 2;
        if (ch == 'b') state = 1;
       break;
     } //close switch 
     pos++; //increment position 
   } //close while 

   if(state == 2) { //final state checkers 
      t.setType(name);
      t.setVal(s.substr(0,pos));
      s = s.substr(pos);
   }
   else if(state == 2) { //final state checkers 
      t.setType(name);
      t.setVal(s.substr(0,pos));
      s = s.substr(pos);
   }
   return t;
}

Token TokenTWO(string &s) {
   cout << "Matching \"" << s << "\" in TokenTWO";
    char alphabet[] = "ab";
    string name="TokenTWO";
    int state = 0;
    char ch ;
    int length = s.length();
    Token t;
    t.setType("");
    t.setVal(""); 
    int pos = 0;
    while (pos < length && (index(alphabet,ch=s[pos]) >= 0 )  ){ 
      switch(state) {
        case 1:
        if (ch == 'a') state = 2;
        if (ch == 'b') state = 1;
       break;
       case 2:
        if (ch == 'a') state = 2;
        if (ch == 'b') state = 1;
       break;
     } //close switch 
     pos++; //increment position 
   } //close while 

   if(state == 1) { //final state checkers 
      t.setType(name);
      t.setVal(s.substr(0,pos));
      s = s.substr(pos);
   }
   return t;
}

int main() {
   string input = "";
   string line;

   while (getline(cin,line)) {
      input = input + line + "\n";
   };
   cout << "Processing input " << input << endl;

   Token t;
   bool done = false;
   while (!done && input != "") {
      done = true;
      t = TokenONE(input);
      if (t.getType() != "")  {
         done = false;
         cout << "Found token:";
         cout << t.toString() << endl;
         cout << "Remaining string is \"" << input << '\"';
         continue;
      }

      t = TokenTWO(input);
      if (t.getType() != "")  {
         done = false;
         cout << "Found token:";
         cout << t.toString() << endl;
         cout << "Remaining string is \"" << input << '\"';
         continue;
      }

   } // close while 

   return 0;
}

