<|instruction|>
Solve the below problem. The solution should start with an abridged problem statement. Then key observations. Then full solution based on the observations. Then C++ and Python implementations with comments.

398. Friends of Friends
Time limit per test: 0.25 second(s)
Memory limit: 65536 kilobytes
input: standard
output: standard



Social networks are very popular now. They use different types of relationships to organize individual users in a network. In this problem friendship is used as a method to connect users. For each user you are given the list of his friends. Consider friendship as a symmetric relation, so if user a is a friend of user b then b is a friend of a.

A friend of a friend for a is such a user c that c is not a friend of a, but there is such b that b is a friend of a and c is a friend of b. Obviously c ≠ a.

Your task is to find the list of friends of friends for the given user x.

Input
The first line of the input contains integer numbers N and x (1 ≤ N ≤ 50, 1 ≤ x ≤ N), where N is the total number of users and x is user to be processed. Users in the input are specified by their numbers, integers between 1 and N inclusive. The following N lines describe friends list of each user. The i-th line contains integer di (0 ≤ di ≤ 50) — number of friends of the i-th user. After it there are di distinct integers between 1 and N — friends of the i-th user. The list doesn't contain i. It is guaranteed that if user a is a friend of user b then b is a friend of a.

Output
You should output the number of friends of friends of x in the first line. Second line should contain friends of friends of x printed in the increasing order.

Example(s)
sample input
sample output
4 2
1 2
2 1 3
2 4 2
1 3
1
4

sample input
sample output
4 1
3 4 3 2
3 1 3 4
3 1 2 4
3 1 2 3


<|response|>
## 1. Abridged problem statement

Given an undirected "friendship" graph of N users (numbered 1 to N) and a particular user x. A "friend of a friend" of x is any user c that:
- is not x,
- is *not* a direct friend of x, and
- shares at least one mutual friend b with x (b is a direct friend of both x and c).

Find all such users c, output their count and list them in increasing order.

---

## 2. Key observations

- N is at most 50, so quadratic or even cubic solutions run instantly.
- We only care about distance-2 vertices from x (excluding x itself and x's neighbors).
- Friendship is symmetric: if a is in b's list, b is in a's list.
- Checking "does c share a friend with x?" amounts to: exists f such that adj[x][f] and adj[f][c].

---

## 3. Full solution approach

1. Read N and x.
2. Build the adjacency matrix `adj[1..N][1..N]`, where `adj[i][j] = 1` if i and j are friends.
3. For each user u from 1 to N:
   - Skip u == x.
   - Skip if `adj[x][u]` is true (direct friend).
   - Scan all f from 1 to N: if `adj[x][f] && adj[f][u]`, mark u as "friend-of-friend" and break.
   - If marked, add u to result.
4. Print result.size(), then the elements (already in increasing order since u goes 1 to N).

Time complexity: O(N^2). Memory: O(N^2), trivial for N <= 50.

---

## 4. C++ implementation

```cpp
#include <bits/stdc++.h>

using namespace std;

template<typename T1, typename T2>
ostream& operator<<(ostream& out, const pair<T1, T2>& x) {
    return out << x.first << ' ' << x.second;
}

template<typename T1, typename T2>
istream& operator>>(istream& in, pair<T1, T2>& x) {
    return in >> x.first >> x.second;
}

template<typename T>
istream& operator>>(istream& in, vector<T>& a) {
    for(auto& x: a) {
        in >> x;
    }
    return in;
};

template<typename T>
ostream& operator<<(ostream& out, const vector<T>& a) {
    for(auto x: a) {
        out << x << ' ';
    }
    return out;
};

int n, x;
vector<vector<int>> adj;

void read() {
    cin >> n >> x;
    adj.assign(n + 1, vector<int>(n + 1, 0));
    for(int i = 1; i <= n; i++) {
        int cnt;
        cin >> cnt;
        while(cnt--) {
            int f;
            cin >> f;
            adj[f][i] = 1;
            adj[i][f] = 1;
        }
    }
}

void solve() {
    // A friend of a friend of x is any user i that is not x, is not a direct
    // friend of x, yet shares a common friend o with x (o is a friend of x and
    // o is a friend of i). Scan every candidate i and, using the adjacency
    // matrix, look for such an intermediate o; emit the matching users in
    // increasing order.

    vector<int> li;
    for(int i = 1; i <= n; i++) {
        if(i == x || adj[i][x]) {
            continue;
        }

        bool ok = false;
        for(int o = 1; o <= n; o++) {
            if(adj[x][o] && adj[o][i]) {
                ok = true;
            }
        }

        if(ok) {
            li.push_back(i);
        }
    }

    cout << li.size() << '\n';
    cout << li << '\n';
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int T = 1;
    // cin >> T;
    for(int test = 1; test <= T; test++) {
        read();
        // cout << "Case #" << test << ": ";
        solve();
    }

    return 0;
}
```

---

## 5. Python implementation

```python
def main():
    import sys
    data = sys.stdin.read().split()
    it = iter(data)

    # Read number of users n and target user x
    n = int(next(it))
    x = int(next(it))

    # Build adjacency sets for each user
    # friends[i] is a set of direct friends of i
    friends = [set() for _ in range(n+1)]
    for i in range(1, n+1):
        d = int(next(it))
        for _ in range(d):
            f = int(next(it))
            friends[i].add(f)
            friends[f].add(i)

    result = []
    # Examine each candidate user u
    for u in range(1, n+1):
        if u == x:
            continue              # skip x itself
        if u in friends[x]:
            continue              # skip direct friends

        # Check if they share any mutual friend
        if friends[x].intersection(friends[u]):
            result.append(u)

    # Sort (though c was 1..N in order)
    result.sort()

    # Output
    print(len(result))
    if result:
        print(*result)

if __name__ == "__main__":
    main()
```
