private RopeString(RopeString left, RopeString right)
 {
     _leftChild  = left;
     _rightChild = right;
     _isLeaf     = false;
     _length     = GetLength(left) + GetLength(right);
 }
        /// <summary>Вставляет переданную строку в нужную позицию</summary>
        public RopeString Insert(int position, RopeString rope)
        {
            RopeString left, right;

            this.Split(position, out left, out right);
            return(left + rope + right);
        }
 /// <summary>Разбивает строку на две части </summary>
 private void Split(int leftLength, out RopeString left, out RopeString right)
 {
     leftLength = Math.Min(leftLength, this.Length);
     // Тривиальные случаи
     if (leftLength == 0)
     {
         left  = new RopeString();
         right = this;
     }
     else if (leftLength >= Length)
     {
         left  = this;
         right = new RopeString();
     }
     else
     {
         if (_isLeaf) // Базовый случай - лист
         {
             left          = new RopeString(this.Value);
             left._length  = leftLength;
             right         = new RopeString(this.Value);
             right._offset = leftLength;
             right._length = this.Length - leftLength;
         }
         else
         {
             // Определяем, в каком сыне находится граница разбиения
             if (leftLength <= GetLength(_leftChild))
             {
                 RopeString leftLeft, leftRight;
                 _leftChild.Split(leftLength, out leftLeft, out leftRight);
                 left  = leftLeft;
                 right = leftRight + _rightChild;
             }
             else
             {
                 RopeString rightLeft, rightRight;
                 _rightChild.Split(leftLength - GetLength(_leftChild), out rightLeft, out rightRight);
                 left  = _leftChild + rightLeft;
                 right = rightRight;
             }
         }
     }
 }
        static void Main(string[] args)
        {
            string     initialString = Console.ReadLine();
            RopeString rope          = new RopeString(initialString);
            int        linesCnt      = int.Parse(Console.ReadLine());

            for (int i = 0; i < linesCnt; i++)
            {
                string[] tmp  = Console.ReadLine().Split(sep);
                int      from = int.Parse(tmp[0]);
                int      to   = int.Parse(tmp[1]);
                int      pos  = int.Parse(tmp[2]);

                RopeString fragment  = rope.Substring(from, to - from + 1);
                RopeString cuttedStr = rope.Erase(from, to - from + 1);

                if (pos == 0)
                {
                    rope = fragment + cuttedStr;
                }
                else if (pos == cuttedStr.Length)
                {
                    rope = cuttedStr + fragment;
                }
                else
                {
                    // вставить после k-го символа оставшейся строки
                    // оставшаяся строка = cuttedStr
                    rope = cuttedStr.Insert(pos, fragment);
                }

                //Console.WriteLine(rope.Value);
            }


            Console.WriteLine(rope.Value);
            //Console.ReadLine();
        }
 // Вспомогательная функция для получения длины, избавляющая от проверки на null
 private static int GetLength(RopeString rope)
 {
     return(rope == null ? 0 : rope.Length);
 }
 // Вспомогательная функция для получения результата, избавляющая от проверки на null
 private static string GetValue(RopeString rope)
 {
     return(rope == null ? "" : rope.Value);
 }