{
TASK:bands
LANG:Pascal
}

type
  Uk = ^ Elem;
  Elem = record
    Color: array[1..100000] of Byte;
    br: LongInt;
    UkNext: Uk;
  end;

var
  codes: array[0..20000] of Uk;
  n,m: LongInt;
  Head,p,q,pok: Uk;
  i: LongInt;
  Oper: Byte;

procedure scan1;
var
  i,j: LongInt;
  c: Byte;
  p,q: Uk;

begin
  readln(i,j,c);
  j:= j-1;

  p:= codes[i];
  q:= codes[j];

  pok:= p;
  pok^.br:= pok^.br + 1;
  pok^.Color[pok^.br]:= c;
  repeat
    pok:= pok^.UkNext;
    pok^.br:= pok^.br + 1;
    pok^.Color[pok^.br]:= c;
  until pok=q;
end;

procedure scan2;
var
  i,j: LongInt;
  p,q: Uk;

begin
  readln(i,j);
  j:= j-1;

  p:= codes[i];
  q:= codes[j];

  pok:= p;
  pok^.br:= pok^.br - 1;
  repeat
    pok:= pok^.UkNext;
    pok^.br:= pok^.br - 1;
  until pok=q;
end;

procedure scan3;
var
  i: LongInt;

begin
  readln(i);
  pok:= codes[i];
  writeln(pok^.Color[pok^.br]);
end;

begin
  readln(n,m);
  new(Head);
  codes[0]:= Head;
  Head^.Color[1]:= 0;
  Head^.br:= 1;
  new(p);
  codes[1]:= p;
  p^.Color[1]:= 0;
  p^.br:= 1;
  Head^.UkNext:= p;
  for i:= 2 to n-1 do
  begin
    new(q);
    codes[i]:= q;
    p^.UkNext:= q;
    q^.Color[1]:= 0;
    q^.br:= 1;
    p:= q;
  end;
  p^.UkNext:= nil;

  for i:= 1 to m do
  begin
    read(Oper);
    if Oper = 1 then
      scan1;
    if Oper = 2 then
      scan2;
    if Oper = 3 then
      scan3;
  end;
  dispose(p);
  dispose(q);
  dispose(Head);
  dispose(pok);
end.