using namespace std;
const int N = 1e4 + 10;
int p[N], s[N];
int find(int x)  // 并查集
{
    if(p[x]==x||p[p[x]] == p[x])return p[x];//当x的父节点为根节点或者x本身为根节点时,就不需要进行路径压缩,直接返回即可
    // 如果以上情况都不满足那么将x直接指向根节点,在指向之前父节点是直接指向根节点的(因为他是递归的),所以要把s[x]加上s[p[x]],这样才是x到根节点的权值
    int r = find(p[x]);
    s[x] += s[p[x]];
    p[x] = r;
    return r;
}
int main()
{
    int n, m;
    cin >>n >>m;
    for(int i = 1; i <= n; i ++)
    {
        p[i] = i;
    }
    while (m -- )
    {
        int t, a, b;
        cin >> t >>a >>b;
        if(t == 1)
        {
            a = find(p[a]), b =find(p[b]);
            if(find(a) != find(b)){
                s[find(a)] -= s[find(b)];
                p[find(a)] = find(b);
        }
        }
        else {
              s[find(a)] += b;
        }
    }
    for(int i = 1; i <= n; i ++)
    {
        if(find(i) == i)cout << s[i]<<" ";
        else {
            cout << s[i] + s[find(i)] << " ";
        }
    }
}