\begin{problem}{Динамический Лес}      
{стандартный ввод}
{стандартный вывод}
{2 секунды}{256 мебибайт}

Вам нужно научиться обрабатывать 3 типа запросов:

\begin{enumerate}
  \item Добавить ребро в граф (\t{link}).
  \item Удалить ребро из графа (\t{cut}).
  \item По двум вершинам $a$ и $b$ вернуть длину пути между ними
    (или $-1$, если они лежат в разных компонентах связности) (\t{get}).
\end{enumerate}

Изначально граф пустой (содержит $N$ вершин, не содержит ребер).
Гарантируется, что в любой момент времени граф является лесом. При добавлении ребра гарантируется,
что его сейчас в графе нет. При удалении ребра гарантируется, что оно уже добавлено.

\InputFile

Числа $N$ и $M$ ($1 \le N \le 10^5 + 1$, $1 \le M \le 10^5$) --- количество вершин в дереве и, соответственно, запросов.
Далее $M$ строк, в каждой строке команда (\t{link} или \t{cut}, или \t{get}) и 2 числа от $1$ до $N$ ---
номера вершин в запросе.

\OutputFile

В выходной файл для каждого запроса \t{get} выведите одно число --- расстояние между вершинами, или $-1$, если
они лежат в разных компонентах связности.

\Example

\begin{example}
\exmp{
3 7
get 1 2
link 1 2
get 1 2
cut 1 2
get 1 2
link 1 2
get 1 2
}{
-1
1
-1
1
}%
\exmp{
5 10
link 1 2
link 2 3
link 4 3
cut 3 4
get 1 2
get 1 3
get 1 4
get 2 3
get 2 4
get 3 4
}{
1
2
-1
1
-1
-1
}%
\end{example}

\end{problem}                           
