/*
  Copyright 2013,2016 Marek "p2004a" Rusinowski
  Disjoint-set data structure(Find&Union)
*/
#include <cstdio>
#include <vector>
#include <numeric>

using namespace std;

class FindUnion {
  vector<int> root, rank;

 public:
  FindUnion(int n) : root(n), rank(n) {
  	iota(root.begin(), root.end(), 0);
  }

  int find_set(int v) {
    if (root[v] == v) return v;
    root[v] = find_set(root[v]);
    return root[v];
  }

  void union_sets(int v, int u) {
    v = find_set(v);
    u = find_set(u);
    if (rank[v] < rank[u]) {
      root[v] = u;
    } else if (rank[v] > rank[u]) {
      root[u] = v;
    } else {
      root[v] = u;
      ++rank[v];
    }
  }
};

int main() {
  int n, m;
  scanf("%d %d\n", &n, &m);
  FindUnion f(n);
  int a, b;
  char c;
  for (int i = 0; i < m; ++i) {
    scanf("%c", &c);
    switch(c) {
      case 'f': {
        scanf("%d\n", &a);
        printf("%d\n", f.find_set(a - 1) + 1);
        break;
      }
      case 'u': {
        scanf("%d %d\n", &a, &b);
        f.union_sets(a - 1, b - 1);
        break;
      }
    }
  }
  return 0;
}
